当一个实体具有复合主键时,实体框架核心中的多对多关系

时间:2018-02-11 22:30:20

标签: c# entity-framework .net-core entity-framework-core

我有以下课程:

public class InvoiceLine
{
    public Guid Id { get; set; }

    public int LineNumber { get; set; }    

    public List<ProductCode> ProductCodes { get; set; }    
}

public class ProductCode
{
    public string Category { get; set; }
    public string Value { get; set; }
}

ProductCode的情况下,CategoryValue是主键。

我在DbContext

中进行了设置
modelBuilder.Entity<ProductCode>()
            .HasKey(pc => new { pc.Category, pc.Value });

一个InvoiceLine可以包含许多产品代码,但产品代码可用于各种InvoiceLine

在EF Core中,我必须创建一个带有ID和权限的连接实体:

public class InvoiceLineProductCode
{
    public Guid InvoiceLineId { get; set; }
    public InvoiceLine InvoiceLine { get; set; }
    public ProductCode ProductCode { get; set; }            
}

如何设置ProductCodeId

1 个答案:

答案 0 :(得分:3)

添加复合FK与添加单列FK类似。

首先添加引用实体的PK列:

public class InvoiceLineProductCode
{
    public Guid InvoiceLineId { get; set; }
    public InvoiceLine InvoiceLine { get; set; }
    public string ProductCodeCategory { get; set; } // <--
    public string ProductCodeValue { get; set; } // <--
    public ProductCode ProductCode { get; set; }
}

然后像往常一样定义复合连接实体PK:

modelBuilder.Entity<InvoiceLineProductCode>()
    .HasKey(e => new { e.InvoiceLineId, e.ProductCodeCategory, e.ProductCodeValue });

另外,请不要忘记更改Invoice集合导航属性类型:

public class InvoiceLine
{
    public Guid Id { get; set; }
    public int LineNumber { get; set; }    
    public List<InvoiceLineProductCode> ProductCodes { get; set; } // <--
}

由于这些名称符合EF Core惯例,因此您已完成。如果他们不这样做,关系的完整配置ProductCode - &gt; InvoiceLineProductCode会是这样的:

modelBuilder.Entity<InvoiceLineProductCode>()
    .HasOne(e => e.ProductCode)
    .WithMany()
    .HasForeignKey(e => new { e.ProductCodeCategory, e.ProductCodeValue })
    .IsRequired()
    .OnDelete(DeleteBehavior.Cascade);