【问题标题】:EF Core: Many to Many relationship without navigational entity collectionsEF Core:没有导航实体集合的多对多关系
【发布时间】:2021-11-24 15:18:31
【问题描述】:

我想实现一个遵循 DDD 和聚合原则的模型。

我在 CompanyUser 之间有多对多关系,但它们都是聚合根,我想通过引用 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&lt;int&gt; 类型属性,只是表示多对多数据模型关系的另一种(显式)方式。
  • EF 核心现在允许您流畅地映射私有字段,因此我应该能够将这些导航属性设为私有并流畅地配置它们,然后提供一个仅选择 UserId 列表的公共IEnumberable&lt;int&gt; .你是对的,虽然我真的应该创建一个单独的数据模型,但我只是想避免这个特定项目的额外复杂性,同时尝试设置一些聚合边界;我猜是一个中间立场

标签: entity-framework entity-framework-core domain-driven-design


【解决方案1】:

当然,您只需选择退出方便且有用的 EF 多对多模式,该模式具有隐藏的链接表,并添加一流的链接实体。例如

public class Company
{
    public List<CompanyUser> CompanyUsers { get; set; }
}

public class Users
{
    public List<CompanyUser> CompanyUsers { get; set; }
}

public class CompanyUser
{
    public int CompanyId {get;set;}
    public int UserId {get;set;}
}

并将 CompanyUser 配置为在 (CompanyId,UserId) 上有其键,在 (UserId, CompanyId) 上有一个备用键(或唯一约束)。

CompanyUser.CompanyCompanyUser.User 导航属性放在链接实体上显然更方便,但完全是可选的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多