web-dev-qa-db-ja.com

多対多の再帰関係コードを最初に自己参照するEntity Framework

私はこれをまったく機能させることができないようです

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

マッピングを追加しようとしましたが、無駄でした。 CTP5でこれを行う方法はありますか?

42
Korayem

慣例により、Code Firstは単方向の関連付けを1対多として扱います。したがって、多対多の自己参照アソシエーションが必要であることをCode Firstに通知するには、流れるようなAPIを使用する必要があります。

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

私が正しければ、このコードで多対多のテーブル名に影響を与えることができます:

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

お役に立てれば。

19
Nils

これをModel-Firstを使用してEF 4 CTP5で機能させることができますが、CTP5 Code Firstには自己参照型および多態性のクエリ構成に関するバグが多すぎるため、このようなシナリオでCode Firstを使用できません。 Morteza Manavi(他の回答を参照)は彼のブログでそれらのいくつかを文書化しました。

2
dthorpe

あなたの例は多対多の関係ではなく、より再帰的な関係です。

修正方法がわかりません。ただし、コードの問題は、同じ行の同じ名前の2つのフィールドが取得されることです。行のIDのMemberIdおよび友達のIDのMemberId。

編集

このようにしてみてください:

    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
Shiraz Bhaiji