我有一张桌子,可以在多对多的自我联接中链接到自己。这些表是正确创建的,但实体框架在链接表中添加了一个额外的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);
编辑:
这就是我想要建模的东西。实体链接到另一个具有活动附加属性的实体。它是一个多对多关系(实体可以链接到许多其他实体),具有附加属性。
答案 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);