【发布时间】:2021-11-24 15:18:31
【问题描述】:
我想实现一个遵循 DDD 和聚合原则的模型。
我在 Company 和 User 之间有多对多关系,但它们都是聚合根,我想通过引用 Id 而不是实体类型来模拟它们的关系,即
public class Company
{
public List<int> UserIds { get; set; }
}
public class Users
{
public List<int> CompanyIds { get; set; }
}
是否可以使用 Fluent 模型构建器 API 来实现这一点?也就是说,它会构建一个由列组成的多对多表:| UserId | CompanyId |
【问题讨论】:
-
EF模型是数据模型,一般不同于领域模型。由于 EF 不会遵循您的 DDD 原则,因此要么创建单独的模型,要么违反您的原则。 EF Core documentation 明确声明“多对多关系需要集合导航属性两边”
-
只有当您希望遵守标准 EF 约定时,引用的句子似乎才是正确的。在使用大卫的回答和:Indirect Mapping 文档之后,我应该能够实现我的目标。
-
它仍然具有导航属性和特殊链接“实体”,所以我看不出这如何符合您的 DDD 原则。当然,它不提供
List<int>类型属性,只是表示多对多数据模型关系的另一种(显式)方式。 -
EF 核心现在允许您流畅地映射私有字段,因此我应该能够将这些导航属性设为私有并流畅地配置它们,然后提供一个仅选择 UserId 列表的公共
IEnumberable<int>.你是对的,虽然我真的应该创建一个单独的数据模型,但我只是想避免这个特定项目的额外复杂性,同时尝试设置一些聚合边界;我猜是一个中间立场
标签: entity-framework entity-framework-core domain-driven-design