自引用多对多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; } }