我想建立这样的关系(一个区域在 x 个其他区域的附近)

public class Zone
{
    public string Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ZoneNeighourhood> ZoneNeighourhoods { get; set; }
}

public class ZoneNeighbourhood
{
    public virtual Zone Zone1 { get; set; }
    public virtual Zone Zone2 { get; set; }
}

不幸的是,这行不通,因为 EF 生成的 FK 不正确......我怎样才能让这样的结构工作?

具有 3 个区域的示例:区域 1、区域 2、区域 3

1区邻居:

2区,
3区

2区邻居:

1区

3区邻居:

1区

有什么建议吗?

最佳答案

您的映射不正确。您正在创建自引用实体,因此您需要单独的传入和传出关系集合。单一收藏是不够的。

public class Zone
{
    public string Id { get; set; }
    public string Name { get; set; }
    [InverseProperty("NeighbourOf")]
    public virtual ICollection<Zone> NeighbourTo { get; set; }
    [InverseProperty("NeighbourTo")]
    public virtual ICollection<Zone> NeighbourOf { get; set; }
}

您不需要映射连接表,除非您还想向关系添加一些附加属性。

如果您只想要单个集合,则必须使用 fluent 映射:
public class Zone
{
    public string Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Zone> Neighours { get; set; }
}

public class Context : DbContext
{
    public DbSet<Zone> Zones { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Zone>()
                    .HasMany(z => z.Neighbours)
                    .WithMany();
    }
}

关于c# - Entity Framework 4.1 - 代码优先 : many-to-many relationship,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5802072/

10-11 00:59