假设我有两个实体:
public class Customer
{
public int CustomerId { get; set; }
public Guid CustomerKey { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public Guid CustomerKey { get; set; }
public string Name { get; set; }
}
1 个客户可以拥有许多产品,但我想根据CustomerKey
属性绑定它们。下面是示例数据的示例:
CustomerId | CustomerKey
1 | {00000000-0000-0000-0000-111111111111}
2 | {00000000-0000-0000-0000-222222222222}
ProductId | Name | CustomerKey
1 | Product1 | {00000000-0000-0000-0000-111111111111}
2 | Product2 | {00000000-0000-0000-0000-111111111111}
3 | Product3 | {00000000-0000-0000-0000-222222222222}
因此,第一个客户拥有前两个产品,第二个客户拥有最后一个产品。我尝试做这样的事情:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().HasMany(m => m.Products);
}
但是我如何指定我要将它们绑定到CustomerKey
上?
这是可能的,但前提是Customer
的CustomerKey
属性(列(是唯一的。这是 EF Core 要求(实际上是关系数据库 FK 要求,但 EF Core 仅支持可表示为关系数据库 FK 约束的关系(,因此,如果不是,则无法要求。
为此,流畅的 API 是HasPrincipalKey
方法:
配置此关系所针对的唯一属性。通常,仅当要使用主键以外的属性作为主体属性时,才会调用此方法。如果指定的属性还不是唯一约束(或主键(,则将引入新的唯一约束。
当然,FK 像往常一样配置HasForeignKey
.
将其应用于您的模型:
modelBuilder.Entity<Customer>()
.HasMany(customer => customer.Products)
.WithOne() // no navigation property
.HasForeignKey(product => product.CustomerKey)
.HasPrincipalKey(customer => customer.CustomerKey);
将具有导航属性的两个类声明给对方。使用主键上的ForeignKey
属性标记其中一个表(依赖表(。
public class Customer
{
public int CustomerId { get; set; }
[Index("IX_Customer_Key", 1, IsUnique = true)]
public Guid CustomerKey { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public Guid CustomerKey { get; set; }
public string Name { get; set; }
[ForeignKey("CustomerKey")]
public Customer Customer{ get; set; }
}