2012-01-22 7 views
1

私はEntity Framework 4.1を最初に使用していますが、多対多の関連レコードを取得する際には少し問題があります関係。私はメインメンバーエンティティを持っていて、次に関連付けられたMemberStatus(1対多の関係)と関連付けられたMemberPosition(多対多の関係)を持っています。Entity Framework 4.1を使用して多対多関係で関連レコードを取得するコードファースト

管理コンソールでは、MemberStatusesまたはMemberPositionsのリストを取得していますが、値を削除できるかどうかを判断できるように、これらの値にメンバーが割り当てられているかどうかを知る必要があります。

私は私が私の管理コンソールで使用しています次のコードを持っている:予想通り

var statusList = MemberStatusRepository.AllIncluding(x => x.Members).ToList(); // This works... 
var positionList = MemberPositionRepository.AllIncluding(x => x.Members).ToList(); // This doesn't... 

statusList値が戻ってくるとステータスの収集が割り当てられているどのように多くのメンバーの数を含んでいます。しかし、postionListには適切なリストが返されますが、メンバーが割り当てられていることがわかっている場合、各位置のMembersコレクションには0が表示されます。

私は各メンバーのポジションのリストを得ることができるので、私のメンバーマップではマッピングが正しいと思います。私はちょうど各位置のメンバーのリストである逆を得ることができません。また、EFによって作成されたDBは、Members to Positionsの多対多リレーションシップの適切なスキーマで正しいと見なされます。

エンティティのコードとエンティティタイプコンフィグレーションから継承したEFマッピングは次のとおりです。上記のコードを呼び出すと、メンバーのリストが各位置とともに返されるように、MemberPositionマップには何が欠けていますか?

public class Member : Entity 
{ 
    public string Email { get; set; } 
    public int StatusId { get; set; } 
    public virtual MemberStatus Status { get; set; } 
    public virtual List<MemberPosition> Positions { get; set; } 
} 

public class MemberStatus : Entity 
{ 
    public string Name { get; set; } 
    public ICollection<Member> Members { get; set; } 
} 

public class MemberPosition : Entity 
{ 
    public string Name { get; set; } 
    public ICollection<Member> Members { get; set; } 
} 

public MemberMap() 
{ 
    ToTable("Members"); 
    Property(m => m.Email).IsRequired().HasMaxLength(255); 
    HasMany(m => m.Positions).WithMany() .Map(m => m.ToTable("Member_MemberPositions").MapLeftKey("MemberId").MapRightKey("PositionId")); 
    HasRequired(m => m.Status).WithMany(s => s.Members).WillCascadeOnDelete(false); 
} 

public MemberStatusMap() 
{ 
    ToTable("MemberStatuses"); 
} 

public MemberPositionMap() 
{ 
    ToTable("MemberPositions"); 
    HasMany(p => p.Members).WithMany(); 
} 

答えて

2

多対多マッピングでは、逆ナビゲーションプロパティのExplicite仕様がありません。それは次のようになります。

HasMany(m => m.Positions) 
.WithMany(p => p.Members) // <- important to specify the navigation property 
.Map(m => m.ToTable("Member_MemberPositions") 
      .MapLeftKey("MemberId") 
      .MapRightKey("PositionId")); 

あなたのマッピングは、EFがMemberMemberPositionの間に追加の1対多の関係を作成できます。 MemberPosition.Membersは、この関係の一部であり、多対多の関係ではありません。実際には、作成されたデータベーススキーマでこれを確認する必要があります。私はMemberPosition_Idまたはあなたの持っていたくないこの1対多の関係に属しているMemberテーブルのような外部キーを期待します。その外部キーがデータベース内のNULL(NULL可能な列である必要があります)である場合、ポジションにはメンバーがありません。したがって、2番目のクエリは期待どおりに機能せず、すべての位置に対して空のメンバーコレクションを返します。

+0

これはうまくいきました。ありがとう! – bigmac

関連する問題