4

当我的域模型不是表驱动时,我正在努力寻找一种使 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 实体(通过部分)实现的接口,但由于两个对象图的阻抗不匹配,这是不可能的。

建议?

4

2 回答 2

3

不幸的是,Linq to SQL 几乎迫使您进入一个每个表类的模型,它不支持将单个实体类映射到多个数据库表。

更不幸的是,很少有 ORM 会支持更复杂的映射,而且支持并提供体面的 LINQ 支持的也很少。唯一我什至可以确定的是 NHibernate(我们在实体框架方面的经验认为它在这方面确实不比 L2S 好)。

此外,尝试在 LINQ 表达式中使用规范模式将是一个相当大的挑战。

即使使用 ORM,即使使用像 NHibernate 这样非常强大的抽象 ORM,仍然需要克服很大的阻抗不匹配。

于 2011-04-08T20:19:56.030 回答
1

这篇文章解释了如何将规范模式与 linq-to-sql 一起使用。这些规范可以链接在一起,从而构建一个表达式树,您的存储库可以使用它,因此可以使用 linq-to-sql。

我还没有尝试实现它,但是 linq-to-entities 版本在我目前正在从事的项目的待办事项列表中。

于 2011-04-11T16:26:10.047 回答