我有以下课程:
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
的情况下,Category
和Value
是主键。
我在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
?
答案 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);