【问题标题】:How to modify the join table generated in many-to-many entity relationship in EF Core 5如何在 EF Core 5 中修改多对多实体关系中生成的联接表
【发布时间】:2021-03-10 19:10:59
【问题描述】:

在我的应用程序中,两个实体(Bill 和 User)之间存在多对多关系。因此,一个用户可以有很多账单,一个账单可以适用于很多用户。

User{
  public string Id{get; set;}
  public ICollection<Bill> Bills {get; set;}
}

Bill{
  public int Id{get; set;}
  public ICollection<User> Users {get; set;}
}

使用 EF Core 5,我了解到我应该能够忽略 UserBill 的联接表,其中包含两个实体的 ID 和每个其他实体的导航属性。但是,我希望确保给定用户不会出现两次账单。

UserBill{
  public string UserId{get; set;}
  public User Payer{get; set;}

  public int BillId{get; set;}
  public Bill Bill {get; set;}
}

所以我想修改连接表如下:

  1. 向联接表添加唯一约束,但由于联接表是由 EF Core 自动生成的,我正在寻找一种方法来将此唯一约束添加到联接表中

  2. 将其他属性添加到连接表。例如,我需要在连接表中添加 PaymentStatus 以指示账单是否已支付以及其他必要的属性

    UserBill{
    public int Id {get; set;}
    
    public string UserId{get; set;}
    public User Payer{get; set;}
    
    public int BillId{get; set;}
    public Bill Bill {get; set;}
    public PaymentStatus Status {get; set;}
    }
    

这里我现在需要添加唯一性约束,以确保不能多次出现

用户ID,账单ID

我们将不胜感激。 谢谢。

【问题讨论】:

  • 一开始您似乎只需要创建唯一约束,但随后您似乎想在连接表中添加一个 ID 列。所以这很混乱。这个问题一开始很有趣,但后来变得非常简单,因为如果你有一个声明的连接实体类型,只需直接配置它。如果您不想要该加入实体并且不需要ID 列(这对于加入实体类型来说是不寻常的),您可以查看UsingEntity 方法,这里回答为stackoverflow.com/questions/64919574/…
  • UsingEntity 的连接实体类型的配置不是强类型的,因此在这种情况下,您可能需要使用HasIndex 接受字符串数组(列名)。您需要按约定猜测列名(或显式配置 FK 以了解确切名称),例如:join.HasIndex(new[]{ "UserId", "BillId" }).IsUnique()

标签: c# sql-server asp.net-core ef-code-first ef-core-5.0


【解决方案1】:

HasIndex 带有匿名类型选择器允许创建composite index

modelBuilder.Entity<UserBill>()
    .HasIndex(p => new { p.UserId, p.BillId})
    .IsUnique();

【讨论】:

    【解决方案2】:

    替代方案是使用 HasKey 并从 UserBill 中删除 Id

    modelBuilder.Entity<UserBill>()
                .HasKey(p => new {p.UserId, p.BillId});
    

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 2021-04-07
      • 2021-03-30
      • 2019-03-06
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多