当我的域模型不是表驱动时,我正在努力寻找一种使 POCO 与 Linq-to-Sql 一起工作的方法——这意味着我的域对象与数据库模式不匹配。
例如,在我的域层中,我有一个 Appointment 对象,它具有 Recurrence 类型的 Recurrence 属性。这是一个基类,有几个子类,每个子类都基于特定的重复模式。
在我的数据库中,当 Appointment 记录与其重复出现之间始终存在一对一的关系时,拥有单独的 AppointmentRecurrences 表是没有意义的。因此,Appointments 表具有 RecurrenceType 和 RecurrenceValue 列。RecurrenceType 与 RecurrenceTypes 表具有外键关系,因为重复类型(模式)和 Appointments 表之间存在一对多的关系。
除非有办法在 Linq-to-Sql 中创建这两个模型之间的正确映射,否则我只能手动解决代码中的阻抗不匹配问题。
当使用规范模式查询数据库时,这变得更加困难。例如,如果我想返回当前约会的列表,我可以轻松地创建一个使用以下表达式的 Specification 对象:appt => appt.Recurrence.IsDue
。但是,这不会转化为 Linq-to-SQL 空间,因为表达式的源类型不是 L2S 识别的类型(例如,它不是 L2S 实体)。
那么如何在 Linq-to-SQL 中创建复杂的映射来支持我的域模型呢?
或者,在这种情况下是否有更好的方法来实现规范模式?我曾考虑过使用由我的域对象和 L2S 实体(通过部分)实现的接口,但由于两个对象图的阻抗不匹配,这是不可能的。
建议?