当前位置 : 主页 > 手机开发 > 其它 >

如何使POCO与DDD中具有复杂关系的Linq-to-SQL一起工作

来源:互联网 收集:自由互联 发布时间:2021-06-22
当我的域模型不是表驱动时,我正在努力找到一种方法让POCO与 Linq-to-Sql一起工作 – 这意味着我的域对象与数据库模式不匹配. 例如,在我的域层中,我有一个Appointment对象,它具有Recurrence类
当我的域模型不是表驱动时,我正在努力找到一种方法让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,仍然存在很大的阻碍不匹配.

网友评论