首页 > 解决方案 > 如何修改EF Core 5中多对多实体关系中生成的连接表

问题描述

在我的应用程序中,两个实体(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

任何帮助完成这项工作将不胜感激。谢谢你。

标签: c#sql-serverasp.net-coreef-code-firstef-core-5.0

解决方案


HasIndex使用匿名类型选择器允许创建复合索引

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

推荐阅读