如何创建具有复合主键的实体的多对需关系
本文关键字:实体 关系 复合 何创建 创建 | 更新日期: 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表上除了复合主键,ProductId
和AttributeId
外键之外创建了什么外键(通常像ProductAttributes_ProductId
)。我还尝试为表创建一个虚拟主键,但导航属性仍然无法加载ProductAttributes。
是否有一种方法来配置一个多到需要的关系,其中只有一个实体有一个复合键?
我来试试。
似乎不需要ProductAttributes对象,而让EF处理Product和Attribute之间的关系。因此,您的Product类将包含Attribute列表,而不是ProductAttribute。
例如,当添加具有现有属性的Product时,该Attribute实例将已经存在于数据库中。EF应该处理"知道"属性实例是什么,并使用该关系进行适当的更新。