如何使POCO在DDD中使用复杂关系的Linq-to-SQL

当我的域模型不是表驱动时,我正在努力找到一种方法让POCO与Linq-to-Sql一起工作 - 这意味着我的域对象与数据库模式不匹配。 例如,在我的域层中,我有一个Appointment对象,它具有Recurrence类型的Recurrence属性。这是一个基类,有几个子类,每个子类都基于特定的重复模式。 在我的数据库中,当约会记录与其重现之间始终存在一对一的关系时,拥有单独的AppointmentRecurrences表是没有意义的。因此,Appointments表具有RecurrenceType和RecurrenceValue列。 RecurrenceType与RecurrenceTypes表具有外键关系,因为重复类型(模式)和Appointments表之间存在一对多关系。 除非有办法在Linq-to-Sql中创建这两个模型之间的正确映射,否则我将手动解决代码中的阻塞不匹配问题。 在使用规范模式查询数据库时,这变得更加困难。例如,如果我想返回当前约会的列表,我可以轻松创建一个使用以下表达式的Specification对象:
appt => appt.Recurrence.IsDue
。但是,这不会转换为Linq-to-SQL空间,因为Expression的源类型不是L2S识别的类型(例如,它不是L2S实体)。 那么如何在Linq-to-SQL中创建复杂的映射来支持我的域模型呢? 或者,在这种情况下是否有更好的方法来实现规范模式?我想过使用我的域对象和L2S实体(通过局部)实现的接口,但是这两个对象图的阻抗不匹配是不可能的。 建议?     
已邀请:
不幸的是,Linq to SQL几乎迫使你进入每表类模型,它不支持将单个实体类映射到多个数据库表。 更不幸的是,很少有ORM可以支持更复杂的映射,而且很少有这样做,并且提供了不错的LINQ支持。我唯一能够远程确定的是NHibernate(我们对实体框架的体验率在这方面确实不比L2S好)。 此外,尝试在LINQ表达式中使用规范模式将是一个相当大的挑战。 即使使用ORM,即使有像NHibernate这样强大的抽象ORM,仍然存在很大的阻碍不匹配。     
这篇文章解释了如何使用linq-to-sql的规范模式。规范可以链接在一起,构建一个表达式树,可以由存储库使用,因此可以使用linq-to-sql。 我还没有尝试过实现它,但linq-to-entities版本是我目前正在处理的项目的待办事项列表。     

要回复问题请先登录注册