c# - EFCore 和 C# 中聚合之间的 DDD 和引用

标签 c# entity-framework-core domain-driven-design

我有一个问题,我不确定在假定 DDD 并使用 C#/EF Core 时如何解决。

简化情况:我们有 2 个聚合 - ItemWarehouse。它们中的每一个都通过 ExternalId(Guid) 来识别它的身份(FE 等),这也被视为它的域身份。它还具有 数据库 Id,用于在数据库模型中标识它 - 实体模型和 Db 模型是同一类,因为 EF Core 允许使用私有(private)字段 - 仅公开 ExternalId 和必填字段。实体(在 DDD 和 EF Core 意义上)包含大量与对象严格耦合的业务逻辑和方法。一般来说,我遵循 eShop/eShopOnContainers 中的模式示例。

Item 被分配给 Warehouse,当创建一个项目时,我们需要将 Warehouse 传递给它的构造函数。

将完整的 Warehouse 对象传递给 Item 的构造函数(以及 Item 定义的其他方法)是否合适:

public Item(Warehouse warehouse,..)

或者我应该只中继数据库 ID :

public Item(long warehouseId,..)

我对此有疑问,因为一方面我读到聚合不应该引用其他聚合,但另一方面使用 Datbase DB 将实现细节(关系数据库中的对象持久性)泄漏到域模型,这不应该在我看来发生了。

使用外部 ID:

public Item(Guid warehouseId,..)

没有解决问题,因为数据库中的实际关系不基于它。

你怎么看?我有点疑惑。

最佳答案

通常您会为聚合根的 Id 创建一个值对象。依赖数据库生成的 Id 是一种可能性。如果您决定让 Db 生成 Id,那么您将需要使用它。 但是,为什么您仍然需要传递 Warehouse 引用或 Id?看起来 Item 是一个实体,而 Warehouse 是应该包含该实体的聚合根。通常,您不应在聚合根之外创建实体。

编辑:Vaughn Vernon 在红皮书中描述了几种身份创建策略。其中之一是让诸如 SQL Db 之类的持久化机制生成实体或聚合的唯一标识符。

关于c# - EFCore 和 C# 中聚合之间的 DDD 和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963663/

相关文章:

domain-driven-design - 具有深层层次结构的聚合根在 DDD 中是否合适?

asp.net-mvc - 我应该在哪一层放置 .edmx 并生成 POCO 类?

c# - 自动换行后如何获取富文本内容的高度?

c# - 脚手架-DbContext 到不同的输出文件夹

c# - Visual Studio 项目中的二进制依赖项

c# - 使用 EF Core 在通用存储库中包含所有使用反射的导航属性

c# - 使用 appsettings.json 配置 DbContext 映射

php - SF3 文件夹结构中的 DDD

c# - 如何在编译时获得通用参数类型名称?

c# - 随着时间的推移造成的伤害统一