如何基于自定义属性添加一对多关系



假设我有两个实体:

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上?

这是可能的,但前提是CustomerCustomerKey属性(列(是唯一的。这是 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; }
}

最新更新