我遇到了与同一实体实现多对多关系的问题。这是我的班级:
public class District
{
[Key]
public int DistrictId { get; set; }
[Required]
public string Title { get; set; }
[Required]
public string Abbreviation { get; set; }
public List<District> SubDistricts { get; set; }
}
我的目标是让所有地区都在同一张桌子内,让它们相互关联,许多地区与许多地区相关。
如果我没有指定映射,则EF Code First就像是一对多关系一样。
我试图向模型构建器发出指示,但它不起作用:
modelBuilder.Entity<District>()
.HasMany(d => d.SubDistricts)
.WithMany(d => d.SubDistricts)
.Map(mc => { mc.ToTable("DistrictLinks", "dbo");
mc.MapLeftKey("ParentId");
mc.MapRightKey("ChildId");
});
有没有办法用WF做到这一点?提前谢谢!
答案 0 :(得分:4)
您必须使用不带参数的WithMany
重载:
modelBuilder.Entity<District>()
.HasMany(d => d.SubDistricts)
.WithMany()
.Map(mc => { mc.ToTable("DistrictLinks", "dbo");
mc.MapLeftKey("ParentId");
mc.MapRightKey("ChildId");
});
同一导航属性不可能同时是关联的开始和结束。它们要么必须不同,要么结尾是“不可见的”,并且不会在模型中暴露出来 - 模型就是这种情况。
答案 1 :(得分:2)
您的解决方案效果很好,谢谢!与此同时,我想出了另一种解决问题的方法。基本上我在课堂上创建了两个导航属性:
public List<District> ChildDistricts { get; set; }
public List<District> ParentDistricts { get; set; }
所以我的映射现在看起来像这样:
modelBuilder.Entity<District>()
.HasMany(d => d.ParentDistricts)
.WithMany(d => d.ChildDistricts)
.Map(mc => { mc.ToTable("DistrictLinks", "dbo");
mc.MapLeftKey("ParentId");
mc.MapRightKey("ChildId");
});
因此,我在SQL Server中得到了完全相同的表,但我相信我可以更好地导航。我实际上忘了提到层次结构在这里也很重要,而不仅仅是地区之间的联系。
再次感谢你:)