实体框架添加额外的错误链接自我引用多个链接

时间:2015-05-19 10:40:14

标签: entity-framework entity-framework-6

我有一张桌子,可以在多对多的自我联接中链接到自己。这些表是正确创建的,但实体框架在链接表中添加了一个额外的Entity_ID字段。

CREATE TABLE dbo.LinKTable
(
    EntityAID int NOT NULL,
    EntityBID int NOT NULL,
    Entity_ID int NULL,         <-- This should not be here.
    Active bit NOT NULL
)

这个错误的链接/列来自何处!?

POCO声明

实体

public int ID { get; set; }
public virtual ICollection<LinkTable> links { get; set; }

LinkTable

public int EntityAID { get; set; }
public int EntityBID { get; set; }
public Entity EntityA { get; set; }
public Entity EntityB { get; set; }
public bool Active { get; set; }

的DbContext

modelBuilder.Entity<Entity>().ToTable("Entity", "dbo").HasKey(am => new { am.EntityAID, am.EntityBID });
modelBuilder.Entity<Entity>().HasRequired(am => am.EntityA).WithMany().HasForeignKey(am => am.EntityAID).WillCascadeOnDelete(false);
modelBuilder.Entity<Entity>().HasRequired(am => am.EntityB).WithMany().HasForeignKey(am => am.EntityBID).WillCascadeOnDelete(false);

编辑:

enter image description here

这就是我想要建模的东西。实体链接到另一个具有活动附加属性的实体。它是一个多对多关系(实体可以链接到许多其他实体),具有附加属性。

1 个答案:

答案 0 :(得分:2)

我认为问题是因为您没有使用links类中的Entity导航属性来配置其中一对多关系。 EF正在隐含地创建另一个一对多关系(在这种情况下是单向的)。这就是在LinkTable中添加FK列作为该关系的一部分的方式。

您应该使用links导航属性并添加一个新属性,以正确配置您已有的一对多关系:

public class Entity
{
  public int ID { get; set; }
  public virtual ICollection<LinkTable> Links { get; set; }
  // Change the name what you want
  public virtual ICollection<LinkTable> AnotherLinks { get; set; }
}

然后在您的Context上的OnModelCreating方法中执行此操作:

modelBuilder.Entity<LinkTable>().HasRequired(am => am.EntityA).WithMany(e=>e.Links).HasForeignKey(am => am.EntityAID).WillCascadeOnDelete(false);
modelBuilder.Entity<LinkTable>().HasRequired(am => am.EntityB).WithMany(e=>e.AnotherLinks).HasForeignKey(am => am.EntityBID).WillCascadeOnDelete(false);