单个实体上的EF多对多

时间:2012-04-01 17:37:19

标签: entity-framework entity-framework-4.1 many-to-many

我遇到了与同一实体实现多对多关系的问题。这是我的班级:

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做到这一点?提前谢谢!

2 个答案:

答案 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中得到了完全相同的表,但我相信我可以更好地导航。我实际上忘了提到层次结构在这里也很重要,而不仅仅是地区之间的联系。

再次感谢你:)