2011-02-26 74 views
39

我似乎无法使这项工作在所有自引用许多一对多递归关系码第一实体框架

class Member 
{ 
    public virtual IList<Member> Friends { get; set; } 
    [Key] 
    public int MemberId { get; set; } 
    public string Name{ get; set; } 
} 

我尝试添加映射,但徒劳无功。有没有办法与CTP5做到这一点?

+0

我不认为这属于代码第一,但检查[此帖](http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/05198b97-f178-49ba-91da-7a2516a9ad8d)出。 – 2011-02-26 04:29:19

回答

56

按照惯例,代码第一次将采取单向协会评为一对多。因此,你需要用流利的API,让代码首先知道你想有一个多对多的自我引用的关联:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany(); 
} 

注:有一个在CTP5一个已知的bug,它不会让你自定义加入表格列名称。

+2

Morteza,我一直关注你在这里和你的博客。这工作完美无瑕!虽然结果表名为[MemberMembers],这很奇怪,但会在RTM中修复。谢了哥们! – Korayem 2011-02-27 01:48:06

+0

你好,我需要知道我们如何使用多个自引用。例如在相同的示例代码上;公共虚拟IList 朋友{get;组; }公共虚拟IList 父母{get;组; } – 2011-04-20 14:37:32

+0

这很好,谢谢。你知道任何是要指定它将创建的多对多表的名称吗? MemberMembers的作品行得通,但看起来很丑。 – 2013-05-07 00:11:17

0

你的例子不是多对多的关系,它更像是递归关系。

我不知道如何解决它。但是你的代码的问题是你将在同一行上得到两个同名的字段。 MemberId表示该行的id,MemberId表示该朋友的id。

编辑

试着做这样的:

class Member 
    { 
     [Key] 
     public int MemberId { get; set; } 
     public string Name { get; set; } 

     public virtual IList<FriendRelationship> Friends { get; set; } 

    } 

    class FriendRelationship 
    { 
     [Key] 
     public int RelationshipId { get; set; } 

     public Member Friend { get; set; } 
    } 
+0

对我来说,它可以是多对多的,因为它可以通过[LeftMemberId]和[RightMemberId]引入一张表格[Friends]来解决。 不管正确的命名,我不能得到这个工作:( – Korayem 2011-02-26 17:22:23

+0

Thanx队友,我没有得到一个改变尝试你的解决方案,但这是我最初的解决方案,手动做。不能等待RTM :) – Korayem 2011-02-27 17:17:50

2

您可以使用Model-First在EF 4 CTP5中使用此工具,但CTP5 Code First具有太多的自错误和多态查询配置,以便在此类情况下使用Code First。 Morteza Manavi(见其他答案)在他的博客上记录了其中的几个。

+0

的确如此。希望RTM满足我们的要求。代码优先是真棒! – Korayem 2011-02-27 17:16:57

16

如果我是正确的,你可以影响多对多的表名与此代码:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany().Map(m => 
     { 
      m.MapLeftKey("MemberId"); 
      m.MapRightKey("FriendId"); 
      m.ToTable("MembersFriends"); 
     } 
    ); 
} 

希望这会有所帮助。