繁体   English   中英

实体框架使用单独的表映射多对多自我关系

[英]Entity Framework Mapping Many-to-Many Self Relationship with Separate Table

在某些情况下,我有一个排除相同类型实体的实体。 为了实现这一点,我有一个类似的实体类:

public class Entity
{
    public int ID { get; set; }
    public virtual ICollection<EntityExcludedEntity> ExcludedEntities { get; set; }
}

public class ExcludedEntity
{
    public int ID { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }

    public int EntityID { get; set; }
    public virtual Entity Entity { get; set; }

    public int ExcludedEntityID { get; set; }
    public virtual Entity ExcludedEntity { get; set; }
}

//declared in the ExcludedEntity mapping class.
public ExcludedEntityMapping()
{
    HasRequired(t => t.Entity).WithMany(t => t.ExcludedEntity).HasForeignKey(t => t.EntityID)
    HasRequired(t => t.ExcludedEntity).WithMany(t => t.ExcludedEntity).HasForeignKey(t => t.ExcludedEntityID);
}

这导致EF在我的模型中创建第三列和称为Entity_ID外键字段。 似乎认为我在这里定义了另一个关系,但我不明白为什么。

这是与创建的表中的外键有关的部分:

.ForeignKey("dbo.Entities", t => t.EntityID)
.ForeignKey("dbo.Entities", t => t.ExcludedEntityID)
.ForeignKey("dbo.Entities", t => t.Entity_ID)

这篇文章帮助我找到了答案。

基本上,EF不能具有指向同一实体字段的两个外键。 如果需要为同一实体创建两个外键,则应将它们绑定到不同的字段。 因此,在此示例中:

public class Entity
{
    public int ID { get; set; }
    public virtual ICollection<EntityExcludedEntity> ExcludingEntities { get; set; }
    public virtual ICollection<EntityExcludedEntity> ExcludedFromEntities { get; set; }
}

和此配置:

public DBConceptAnswerExcludedAnswerMapping()
{
    HasRequired(t => t.Entity).WithMany(t => t.ExcludingEntities).HasForeignKey(t => t.EntityID);
    HasRequired(t => t.ExcludedEntity).WithMany(t => t.ExcludedFromEntities).HasForeignKey(t => t.ExcludedEntityID);
}

会解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM