如何基于自定义属性添加一对多关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何基于自定义属性添加一对多关系相关的知识,希望对你有一定的参考价值。
可以说我有两个实体:
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
上绑定它们?
答案
这是可能的,但前提是CustomerKey
的Customer
属性(列)是唯一的。这是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; }
}
以上是关于如何基于自定义属性添加一对多关系的主要内容,如果未能解决你的问题,请参考以下文章