【问题标题】:In DDD, can CRUD operations be performed on aggregate entities in isolation of the AR?在 DDD 中,是否可以在 AR 隔离的情况下对聚合实体执行 CRUD 操作?
【发布时间】:2020-04-26 18:41:25
【问题描述】:

假设我有一个 Product 实体,它有一个名为 Brand 的属性。品牌本身就是一个实体(而不是价值对象,因为它必须单独持久化和维护)。

我希望能够在单独的 UI 屏幕上创建、更新或删除品牌。然后在创建或更新产品时,通过下拉列表指定正确的品牌。

以上两个实体中的哪一个可以是聚合根(如果不是两者)?如果一个应该是 AR 而另一个应该是依赖实体,我怎样才能在另一个隔离的情况下对它们执行 CRUD 操作?

一般来说,这个场景如何建模?

【问题讨论】:

    标签: entity aggregate domain-driven-design crud aggregateroot


    【解决方案1】:

    指定聚合根在很大程度上取决于被建模的域。正如您的问题所声称的,“品牌本身就是一个实体”,您想在单独的 UI 屏幕上编辑它“......”,并且还想 “...对其单独执行 CRUD 操作”。这些强烈暗示 Brand 本身与 Product 一起是聚合根。

    品牌是另一个聚合产品的属性。从另一个引用一个聚合的推荐方法是通过标识符引用,而不是直接引用(参见answer,了解其他通过 id 引用聚合的原因)。因此,您的产品可以使用 Brand id 字段声明其品牌,唯一 id 引用相应的品牌,从而可以单独编辑产品和品牌。虽然您的品牌编辑屏幕可能会添加新品牌,但请通过获取它们的唯一 ID 来编辑现有品牌。

    【讨论】:

    • 非常感谢 :) 使用整数或 Guid Id 将直接使用 ORM(实体框架核心)进行持久化,但如果我按照 Evans 的建议将 Id 声明为值对象,我该如何持久化它通过 ORM?我试图映射它,但 Entity Framework 不喜欢它。
    • 我自己不是 EF Core 用户。尽管如此,reference 提供了在 EF Core 中实现值对象的指南。由于 EF Core 2.0 owned entity types 似乎是推荐的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2019-06-29
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多