我应该如何处理引用实体的持久性?

How should I handle persistence for referenced entities?

我正在使用 Entity-Framework 和 DDD。

如果我在两个实体之间有引用,我应该如何处理持久性?更新级联吗?

假设雇主直接提及他们的经理。

如果我更改 Employee.Manager.Name,并保存员工,经理的姓名是否会更改?

假设您的应用程序使用一个 DbContext 的常规设置:

是的,它还会保存引用的实体。

在您设置管理器名称的那一刻,它会加载管理器引用并对其进行跟踪。当您通过调用 DbContext.SaveChanges 保存更改时,它将提交对 DbContext 正在跟踪的对象所做的所有更改。

没有这种行为的唯一选择是使用多个 DbContext 实例,但这会带来许多其他问题(例如:它们不知道彼此的更改)。

从 DDD 的角度来看,从 EmployeeManager 的任何 link 应该仅通过引用 id(假设 Managers 不是部分Employee 聚合根并且 Manager 本身就是一个聚合根)。

本质上,您的 属性 Employee.ManagerId 应该 return 一个允许您检索 EmployeeManager 的 ID。

这将与您使用 Entity Framework 开箱即用的许多 'goodness' 背道而驰,但这对于 DDD 来说很常见。建议围绕业务领域而不是数据库实现来设计领域模型。

就我个人而言,我发现在练习 DDD 时,使用 EF 实体作为我的领域模型并不合适。诸如延迟加载导航属性之类的事情与良好的 DDD 实践相矛盾。这些天我倾向于在自己的项目中使用文档数据库,但是当我必须使用 SQL 时,我将 EF 实体限制在我的持久层并将我的存储库编码为来自我的 return 非 EF 实体领域模型。