自引用多对多recursion关系代码第一个entity framework

我似乎无法完成这项工作

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

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

按照惯例,Code First将把单向关联作为一对多关系。 因此,您需要使用stream畅的API让Code First知道您想拥有多对多的自引用关联:

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

注意:在CTP5中有一个已知的错误,在这种情况下不会让你自定义连接表的列名。

如果我是正确的,你可以用这个代码来影响多对多的表名:

 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"); } ); } 

希望这可以帮助。

您可以使用Model-First在EF 4 CTP5中工作,但CTP5 Code First具有太多错误,使用自引用和多态查询configuration来使用Code First进行此类场景。 Morteza Manavi(见其他答案)在他的博客上logging了其中的几个。

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

我不知道如何解决它。 但是,你的代码的问题是,你会得到同一行上的两个字段具有相同的名称。 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; } }