2016-10-01 69 views
0

这里有一个有趣的位,我以前没有遇到过。我们使用注释手动创建在EF6一个多一对多的关系:不再赘述EF6中的多对多实体

public class User 
{ 
    public int Id { get; set; } 
} 

public class School 
{ 
    public int Id { get; set; } 
} 

public class UserSchool 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int SchoolId { get; set; } 

    [Required] 
    public virtual User User { get; set; } 

    [Required] 
    public virtual School School { get; set; } 
} 

(其它附加的属性 - 我只想说,我们对结表的附加属性,因此为什么我们已经创造了它明确)

所以这工作得很好 - 我们可以使用流畅的API来映射复杂的键,它是无关紧要的。基本上我们已经通过交汇点将两个标准表加入了多对多。优胜者。

现在,我们需要加入表(UserSchool)到另一个表,也可作为许多一对多:

public class IPAddress 
{ 
    public int Id { get; set; } 

    public string IPAddress { get; set; } 
} 

public class UserSchoolIPAddress 
{ 
    ?? what to put in here 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

我都试过了一口流利的API映射通过命名约定和注释来指定ID属性:流畅的API映射只是失败,因为我认为它不喜欢使用导航实体的属性;带注释的ID绑定仅在表模式中第二次复制了UserSchool属性,导致我们出现同步问题。

那么,有没有人遇到过这种情况,并找到了解决方案?

回答

0

好吧,原来我是个白痴。看起来框架实际上会处理我的场景,但是我错误地配置了属性类型,所以出现了不匹配,因此EF试图复制新的属性。因此

的多对接线表的完成的定义是,如下所示:

public class UserSchoolIPAddress 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserSchoolUserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int UserSchoolSchoolId { get; set; } //<-- I had this set to a string for some reason, which broke everything 

    [Key] 
    [Column(Order = 3)] 
    public int IPAddress IPAddressId { get; set; } 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

因此,这将正确地创建使用FK的第二结表,以“多”端(在这种情况下IPAddress)和两个FK到“结”端(UserSchool),并且在这个“超结”上将所有三个FK一起组合成一个复合PK。 EF做得好!

0

如果您以正确的方式配置您的实体,您不需要联结表,EF会为您创建它。

在你的情况下,你有一个用户可以有很多学校和一个可以有很多用户的学校。如果你创建这个模型(并通过流利的apis配置它),EF将为你创建UserSchool表,并且你不需要管理它(EF会为你处理)。

关于IPAddress如果我理解你的模型,IPAddress由单个用户在一所学校使用。你的模型,有一些导航属性可能是这样的。

public class User 
{ 
    public int Id { get; set; } 
    public virtual ICollection<School> Schools {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class School 
{ 
    public int Id { get; set; } 
    public virtual ICollection<User> Users {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class IpAddress 
{ 
    public string Id { get; set; } 
    public virtual User User {get; set;} 
    public virtual School School {get; set;} 
} 
+0

正如我在我原来的问题提到的,我们实际存储的数据对象作为结映射的性能 - 例如'UserSchool'对象实际上有连接其它外键和权限级别。所以我们需要手动配置它们。 – Katstevens