在您的情况下,Item 应该有 2 个导航属性。一个用于链接的项目,另一个用于链接的项目。
public class Item
{
public virtual ICollection<ItemAssociation> AssociatedItems { get; set; }
public virtual ICollection<ItemAssociation> ItemsAssociatedThisItem { get; set; }
}
public class ItemAssociation
{
public int ItemId { get; set; }
public int ItemAssociatedId { get; set; }
public virtual Item Item { get; set; }
public virtual Item ItemAssociated { get; set; }
}
映射:
modelBuilder.Entity<ItemAssociation>()
.HasKey(i => new {i.ItemId , i.ItemAssociatedId });
modelBuilder.Entity<Item>()
.HasMany(i => i.AssociatedItems)
.WithRequired(i => i.ItemAssociated)
.HasForeignKey(i => i.ItemAssociatedId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Item>()
.HasMany(i => i.ItemsAssociatedThisItem )
.WithRequired(i => i.Item)
.HasForeignKey(i => i.ItemId)
.WillCascadeOnDelete(false);
当您想要检索与特定项目相关的所有项目时,您可以获取两个集合,将它们连接起来并删除重复的值。
编辑
无关联实体的映射:
类:
public class Item
{
public int ItemId { get; set; }
public virtual ICollection<Item> AssociatedItems { get; set; }
public virtual ICollection<Item> ItemsAssociatedThisItem { get; set; }
}
映射:
modelBuilder.Entity<Item>()
.HasMany(i => i.AssociatedItems)
.WithMany(i=> i.ItemsAssociatedThisItem)
.Map(i =>
{
i.MapRightKey("ItemId");
i.MapLeftKey("AssociatedItemId");
i.ToTable("ItemsAssociation");
});
生成的迁移:
CreateTable(
"dbo.Items",
c => new
{
ItemId = c.Int(nullable: false, identity: true),
})
.PrimaryKey(t => t.ItemId);
CreateTable(
"dbo.ItemsAssociation",
c => new
{
AssociatedItemId = c.Int(nullable: false),
ItemId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.AssociatedItemId, t.ItemId })
.ForeignKey("dbo.Items", t => t.AssociatedItemId)
.ForeignKey("dbo.Items", t => t.ItemId)
.Index(t => t.AssociatedItemId)
.Index(t => t.ItemId);
我觉得现在更干净了。只需根据您的风格更改名称