我应该如何处理引用实体的持久性?
How should I handle persistence for referenced entities?
我正在使用 Entity-Framework 和 DDD。
如果我在两个实体之间有引用,我应该如何处理持久性?更新级联吗?
假设雇主直接提及他们的经理。
如果我更改 Employee.Manager.Name,并保存员工,经理的姓名是否会更改?
假设您的应用程序使用一个 DbContext 的常规设置:
是的,它还会保存引用的实体。
在您设置管理器名称的那一刻,它会加载管理器引用并对其进行跟踪。当您通过调用 DbContext.SaveChanges
保存更改时,它将提交对 DbContext
正在跟踪的对象所做的所有更改。
没有这种行为的唯一选择是使用多个 DbContext
实例,但这会带来许多其他问题(例如:它们不知道彼此的更改)。
从 DDD 的角度来看,从 Employee
到 Manager
的任何 link 应该仅通过引用 id(假设 Managers
不是部分Employee
聚合根并且 Manager
本身就是一个聚合根)。
本质上,您的 属性 Employee.ManagerId
应该 return 一个允许您检索 Employee
的 Manager
的 ID。
这将与您使用 Entity Framework 开箱即用的许多 'goodness' 背道而驰,但这对于 DDD 来说很常见。建议围绕业务领域而不是数据库实现来设计领域模型。
就我个人而言,我发现在练习 DDD 时,使用 EF 实体作为我的领域模型并不合适。诸如延迟加载导航属性之类的事情与良好的 DDD 实践相矛盾。这些天我倾向于在自己的项目中使用文档数据库,但是当我必须使用 SQL 时,我将 EF 实体限制在我的持久层并将我的存储库编码为来自我的 return 非 EF 实体领域模型。
我正在使用 Entity-Framework 和 DDD。
如果我在两个实体之间有引用,我应该如何处理持久性?更新级联吗?
假设雇主直接提及他们的经理。
如果我更改 Employee.Manager.Name,并保存员工,经理的姓名是否会更改?
假设您的应用程序使用一个 DbContext 的常规设置:
是的,它还会保存引用的实体。
在您设置管理器名称的那一刻,它会加载管理器引用并对其进行跟踪。当您通过调用 DbContext.SaveChanges
保存更改时,它将提交对 DbContext
正在跟踪的对象所做的所有更改。
没有这种行为的唯一选择是使用多个 DbContext
实例,但这会带来许多其他问题(例如:它们不知道彼此的更改)。
从 DDD 的角度来看,从 Employee
到 Manager
的任何 link 应该仅通过引用 id(假设 Managers
不是部分Employee
聚合根并且 Manager
本身就是一个聚合根)。
本质上,您的 属性 Employee.ManagerId
应该 return 一个允许您检索 Employee
的 Manager
的 ID。
这将与您使用 Entity Framework 开箱即用的许多 'goodness' 背道而驰,但这对于 DDD 来说很常见。建议围绕业务领域而不是数据库实现来设计领域模型。
就我个人而言,我发现在练习 DDD 时,使用 EF 实体作为我的领域模型并不合适。诸如延迟加载导航属性之类的事情与良好的 DDD 实践相矛盾。这些天我倾向于在自己的项目中使用文档数据库,但是当我必须使用 SQL 时,我将 EF 实体限制在我的持久层并将我的存储库编码为来自我的 return 非 EF 实体领域模型。