如何创建具有复合主键的实体的多对需关系

本文关键字:实体 关系 复合 何创建 创建 | 更新日期: 2023-09-27 18:09:29

我试图创建三个实体:Products, Attributes, ProductAttributes。

public class Product 
{
    public Guid Id { get; set; }
    public virtual List<ProductAttributes> Attributes { get; set; }
    // product detail properties
}
public class Attribute
{
    public Guid Id { get; set; }
    // attribute detail properties
}
public class ProductAttribute
{
    [Key, Column(Order = 0)]
    public Guid ProductId { get; set; }
    [Key, Column(Order = 1)]
    public Guid AttributeId { get; set; }
    public double Value { get; set; }
    public virtual Product Product { get; set; }
    public virtual Attribute Attribute { get; set; }
}

ProductAttributes本质上是product和Attributes之间的连接表,并保存该属性的值数据。产品可以有任意数量的不同属性,只要它有一个值。Products中的导航属性List<ProductAttributes>对于更新product的属性值至关重要,但我似乎无法正确配置这种关系。

这是我的modelbuilder代码:
// Products
ToTable("Products", schema)
    .HasMany( x => x.Attributes)
    .WithRequired()
    .HasForeignKey(x => x.ProductId)
    .WillCascadeOnDelete(true);
// Attributes
ToTable("Attributes", schema);
// ProductAttributes
ToTable("ProductAttributes", schema)
    .HasKey(x => new { x.ProductId, x.AttributeId });

我已经尝试了上面的设置,仅使用Fluent API,仅使用属性,无论在ProductAttributes表上除了复合主键,ProductIdAttributeId外键之外创建了什么外键(通常像ProductAttributes_ProductId)。我还尝试为表创建一个虚拟主键,但导航属性仍然无法加载ProductAttributes。

是否有一种方法来配置一个多到需要的关系,其中只有一个实体有一个复合键?

如何创建具有复合主键的实体的多对需关系

我来试试。

似乎不需要ProductAttributes对象,而让EF处理Product和Attribute之间的关系。因此,您的Product类将包含Attribute列表,而不是ProductAttribute。

例如,当添加具有现有属性的Product时,该Attribute实例将已经存在于数据库中。EF应该处理"知道"属性实例是什么,并使用该关系进行适当的更新。