聚合根和实体框架

3

我在使用Entity Framework Code First实现聚合根时遇到了困难。假设我们有一个标准问题,即订单和订单项,后者是前者的子级。我们需要在订单类中拥有一个只读订单项集合,以便我们可以(按设计)控制其聚合根(即订单类)中订单项的添加、删除或更新。

  1. 我们如何实现这个订单项列表?这个列表需要是只读的,以防其他开发人员手动向列表中添加订单项,而忽略应该使用的方法。

  2. 我们如何在EF Code First中映射该集合?私有属性是不可映射的。


您可以映射私有成员:https://dev59.com/JmYr5IYBdhLWcg3wRoSW#13810766 - Gert Arnold
1
没错,但这并不是一个DDD解决方案。你增加了领域类和底层持久化机制之间的耦合。 - Milivoj Milani
3
坦率地说,Entity Framework 上下文中的类模型首先是一个数据层。为了方便数据访问,一切都必须进行优化(包括虚成员、用于标识和外键的 Id 属性、双向关系以及与数据库表紧密对应的类)。我的看法是:你不能使用 EF 类模型来实现 DDD,无论如何 ORM 都会有很大的影响。 - Gert Arnold
@GertArnold 是的,看起来是这样。我同意你的观点。 - Milivoj Milani
1个回答

1
  1. 我们如何实现这个OrderItem(s)列表?这个列表需要是只读的,以便其他开发人员不会试图手动在列表中添加OrderItem(s),从而避免应该使用的方法。

一个只读的列表并不能阻止其他开发人员向其中添加或删除项目。它只能防止他们更改OrderItems的引用指针。

您可以将列表设为私有,并在Order上提供AddItem、RemoveItem和UpdateItem方法,以及一个IEnumerable getter用于迭代目的。

  1. 我们如何在EF Code First中映射集合?私有属性无法映射。

我从未使用过EF,但我之前做过一些DDD,对于应用程序和逻辑的真正领域模型,以及数据访问框架的另一组实体(即EF),将其分为两个实体集非常有用。然后使用像AutoMapper这样的东西将EF实体映射到领域实体。

您并不总是必须使用两个实体集,但对于像这样有问题的情况,创建EF想要的实体,然后添加额外的从对象到对象的映射步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接