Code-First EF4中的多对多关系

时间:2010-06-30 11:39:40

标签: c# entity-framework entity-framework-4 poco code-first

您如何在EF4 Code-First CTP3中表示多对多关系?

例如,如果我有以下类:

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Profile> Profiles { get; set; }
}

class Profile
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在数据库中有一个UserProfiles表,其中包含FK for User和FK for Profile。我该如何映射?

编辑:我理解当前如何在ICollection<User>上使用Profile属性进行映射,但我真的不希望它具有相反的导航属性,当它应该是“用户有许多档案“。

2 个答案:

答案 0 :(得分:8)

编辑:CTP4于昨天(2010年7月14日)发布,现在支持:

modelBuilder.Entity<Post>().HasMany(p => p.Tags).WithMany();


我发现终于目前无法做到这一点。 Microsoft正在寻求添加此功能(仅一个导航属性)。

有关详情,请参阅MSDN论坛上的此链接:http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f

答案 1 :(得分:5)

对于多对多关系,您应该在两侧包含导航属性并使其成为虚拟(以利用延迟加载)

class User
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection<Profile> Profiles { get; set; }
}

class Profile
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection<User> Users { get; set; }
}

然后使用该设置,您可以定义多对多关系(您也可以让实体框架为您执行此操作,但我不喜欢它使用的命名约定。)

        modelBuilder.Entity<Profile>().
            HasMany(p => p.Users).
            WithMany(g => g.Profiles).
            Map(t => t.MapLeftKey("ProfileID")
                .MapRightKey("UserID")
                .ToTable("UserProfiles"));

这将为您提供一个名为UserProfiles的表,其UserID和ProfileID为Keys。