您如何在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
属性进行映射,但我真的不希望它具有相反的导航属性,当它应该是“用户有许多档案“。
答案 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。