【问题标题】:How do you create a many-to-required relationship to an entity with a composite primary key?如何创建与具有复合主键的实体的多对必需关系?
【发布时间】:2014-06-18 22:09:58
【问题描述】:

我正在尝试创建三个实体:产品、属性、产品属性。

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 本质上是产品和属性之间的连接表,并保存该属性的值数据。产品可以具有任意数量的不同属性,只要它具有价值即可。 Products 中的导航属性List&lt;ProductAttributes&gt; 对于更新产品的属性值至关重要,但我似乎无法正确配置关系。

这是我的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,仅使用属性,并且除了复合主键 ProductIdAttributeId ProductAttributes 表上的外键。我也尝试为表创建一个虚拟主键,但导航属性仍然​​不会加载 ProductAttributes。

有没有一种方法可以配置只有一个实体具有复合键的多对必需关系?

【问题讨论】:

    标签: c# entity-framework ef-code-first asp.net-mvc-5 composite-primary-key


    【解决方案1】:

    我会试一试。

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

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

    【讨论】:

    • 问题是值列,它是关系的全部点。 ProductA 和 ProductB 都可以有一个 AttributeA,但每个的 Value 可以不同。
    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 2015-01-11
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多