例如,在我的域层中,我有一个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,仍然存在很大的阻碍不匹配.