2012-02-24 55 views
30

我有一个像实体框架4.3代码第一多个使用相同的表

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    public virtual ICollection<Town> Residencies { get; set; } 

    public virtual ICollection<Town> Mayorships { get; set; } 
} 

public class Town 
{ 
    [Key] 
    public long TownId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual ICollection<User> Residents { get; set; } 
    public virtual ICollection<User> Mayors { get; set; } 
} 

我希望EF会创建两个多对多关系的模型多对多使用自动创建TownResidents和TownMayors表。我似乎无法找到必要的约定或明确的注释来获得此结果。

相反,我在Town表中获取两个FK UserIds,在User表中获得两个FK TownIds。

任何想法如何让EF在两个多对多关系中看到这些?

感谢

回答

30

好,EF没有某种词,这将需要确定你(可能)想语法识别算法是User.ResidenciesTown.Residents形成一对导航性能和User.MayorshipsTown.Mayors形成第二对。因此它假定您有一对多关系,并且四个导航属性中的每一个都属于其中一个关系。 (这是您在数据库表中看到四个外键的原因。)

本标准的假设是不是你想要的,因此你必须明确定义的关系来覆盖这个标准约定:

无论是数据注释:

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    [InverseProperty("Residents")] 
    public virtual ICollection<Town> Residencies { get; set; } 

    [InverseProperty("Mayors")] 
    public virtual ICollection<Town> Mayorships { get; set; } 
} 

或用流利的API:

modelBuilder.Entity<User>() 
    .HasMany(u => u.Residencies) 
    .WithMany(t => t.Residents) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownResidents"); 
    }); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.Mayorships) 
    .WithMany(t => t.Mayors) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownMayors"); 
    }); 

流利的API的优点是你可以控制的南e链表(以及键列名称)。您不能用数据注释来定义这些名称。

+0

谢谢。我尝试了两种方法,他们都工作,但像你说的流利方法让你控制表名,所以我更喜欢那种方法。再次感谢。 – Sean 2012-02-24 23:55:55

+0

地图部分不是必需的。你的流利api代码没有它就可以完成这项工作。 – ozgur 2016-05-07 16:39:48

相关问题