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

标签 linq-to-sql domain-driven-design poco ddd-repositories

当我的域模型不是表驱动时,我正在努力寻找一种使 POCO 与 Linq-to-Sql 一起工作的方法——这意味着我的域对象与数据库模式不匹配。

例如,在我的域层中,我有一个 Appointment 对象,它具有 Recurrence 类型的 Recurrence 属性。这是一个基类,有几个子类,每个子类都基于特定的重复模式。

在我的数据库中,当 Appointment 记录与其重复出现之间始终存在一对一的关系时,拥有单独的 AppointmentRecurrences 表是没有意义的。因此,Appointments 表具有 RecurrenceType 和 RecurrenceValue 列。 RecurrenceType 与 RecurrenceTypes 表具有外键关系,因为重复类型(模式)和 Appointments 表之间存在一对多的关系。

除非有办法在 Linq-to-Sql 中创建这两个模型之间的正确映射,否则我只能手动解决代码中的阻抗不匹配问题。

当使用规范模式查询数据库时,这变得更加困难。例如,如果我想返回当前约会的列表,我可以轻松地创建一个使用以下表达式的规范对象:appt => appt.Recurrence.IsDue .但是,这不会转化为 Linq-to-SQL 空间,因为表达式的源类型不是 L2S 识别的类型(例如,它不是 L2S 实体)。

那么如何在 Linq-to-SQL 中创建复杂的映射来支持我的域模型呢?

或者,在这种情况下是否有更好的方法来实现规范模式?我曾考虑过使用由我的域对象和 L2S 实体(通过部分)实现的接口(interface),但由于两个对象图的阻抗不匹配,这是不可能的。

建议?

最佳答案

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

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

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

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

关于linq-to-sql - 如何使 POCO 在 DDD 中与具有复杂关系的 Linq-to-SQL 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599688/

相关文章:

.net-core - DDD 通过间接父实体 ID 访问实体

domain-driven-design - Saga,存储聚合状态的位置

.net - EF4 POCO 生成对象中的枚举

linq-to-sql - StructureMap 和 LINQ to SQL 连接字符串

c# - 如何使用 LINQ 查询平均 DateTime 字段?

asp.net-mvc - 抛出异常或引发领域事件?

c# - 使用 RestSharp 序列化列表中的对象

c# - 删除插入时的非唯一数据

c# - 如何内部连接来自不同数据上下文的表?

c++ - Poco::ServerApplication 的多线程问题