实体框架5代码优先自我引用多个命名关系

时间:2013-05-28 13:20:06

标签: c# ef-code-first foreign-keys entity-framework-5 code-first

我尝试了不同的模型和配置而没有进展。已搜索此特定用途但未成功,发现接近但不相同。

我有一个与其他产品相关的产品,到目前为止只有一个关系如此好,例如“相关产品” 添加其他关系时会出现问题,例如“类似的”。

我所追求的是一种自引用命名关系,理想情况下是一个三列外键表; ProductId,RelatedProductId,RelationId

产品可以具有多个命名关系,并且关系具有一个或多个产品(相关产品)。我想避免多次定义关系的名称。

一个想法如下:

public class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Relation> Relations { get; set; }
}

public class Relation
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

另一个想法是使用特殊的表格:

public class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<ProductRelation> Relations { get; set; }
}

public class Relation
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<ProductRelation> Products { get; set; }
}

public class ProductRelation
{
    [Key, Column(Order = 0)]
    public virtual int ProductId { get; set; }
    [Key, Column(Order = 1)]
    public virtual int RelatedProductId { get; set; }
    [Key, Column(Order = 2)]
    public virtual int RelationId { get; set; }

    [ForeignKey("ProductId")]
    public virtual Product Product { get; set; }
    [ForeignKey("RelatedProductId")]
    public virtual Product RelatedProduct { get; set; }
    [ForeignKey("RelationId")]
    public virtual Relation Relation { get; set; }
}

以上示例是想要的结果布局,我希望在检索时访问它,很可能需要以这种方式创建。 从具有三列映射表的数据库角度来看,下面似乎更干净

我的问题是:

  • 建议的方法是什么?为什么?
  • 如何正确设置密钥映射,以便数据库尽可能理解关系?

0 个答案:

没有答案