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

时间:2018-09-04 10:32:12

标签: c# entity-framework foreign-keys entity-framework-core

让我们说我有两个实体:

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上绑定它们?

2 个答案:

答案 0 :(得分:1)

这是可能的,但前提是CustomerKey的{​​{1}}属性(列)是唯一的。这是EF Core要求(实际上是关系数据库FK要求,但是EF Core仅支持可以表示为关系数据库FK约束的关系),因此,如果不是这样,那么您提出的要求就不可能了。

为此的流畅的API是HasPrincipalKey方法:

  

配置此关系定位的唯一属性。通常,仅当您要使用主键以外的其他属性作为主体属性时,才调用此方法。如果指定的属性还不是唯一约束(或主键),则将引入新的唯一约束。

当然,FK的配置与往常一样HasForeignKey

将其应用于您的模型:

Customer

答案 1 :(得分:0)

相互声明两个具有导航属性的类。在其主键上使用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; }
}