【发布时间】:2022-01-15 15:36:28
【问题描述】:
我们可以在实体内部使用List<ValueObject> 吗?或者我们应该将它们用作List<entity>?
当我在“Product”实体类中使用“List<Discount>”时,实体框架会使用生成的列 ID 创建一个“折扣”表。
我可以将折扣定义为价值对象列表吗? 当值对象用作列表时,将其用作具有标识的实体会更好吗?
第二个问题是关于更新实体内部的“List<Discont>”。如何在其实体中更新此值对象列表(添加、删除折扣)?
谢谢
【问题讨论】:
-
DDD 人 - 总是希望其他人遵循他们的原则,而不是相反。假设您不使用 EF Core,您将如何将“值对象”列表存储在关系数据库中?当您意识到这一点时,您就会明白为什么 EF Core 创建表(并且每个表都必须有主键)。有关最接近的 EF Core 术语(不同于 DDD)的更多信息,请参阅Collections of owned types
-
@IvanStoev 感谢您发布链接。我用过OwnsMany()。但是这个影子属性,不违反使用值对象的规则吗?在这种情况下,我应该通过影子属性“id”更新这个值对象列表吗?
-
@IvanStoev 这样我就可以通过这个属性添加、删除或者更新列表了!它违反了值对象的不变性及其对所有者的依赖。这是真的?如果没有,我该如何更新 valueobject 列表?谢谢
-
我想说的是 DDD 概念、值对象等不是 EF Core 关注的问题。 EF Core 实体(拥有与否)代表数据模型,而不是域模型。那里没有“价值对象”——一切都是实体。如果你想使用 EF Core 从数据库存储/加载你的东西而不违反你的原则,那么创建单独的模型并使用 EF Core 数据模型来加载/持久化你的域实体。
-
在询问 EF 问题时提及您正在使用的数据库变得越来越重要。我可以想象,对值类型列表的支持可以添加到 Cosmos db 提供程序中,因为它已经支持原始类型列表。但我假设您的目标是关系数据库。
标签: entity-framework-core domain-driven-design entity asp.net-core-5.0 value-objects