【发布时间】: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;}
}
所以我想修改连接表如下:
-
向联接表添加唯一约束,但由于联接表是由 EF Core 自动生成的,我正在寻找一种方法来将此唯一约束添加到联接表中
-
将其他属性添加到连接表。例如,我需要在连接表中添加 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