2016-06-29 2 views
0

私はこのように見えるかもしれませクラスを持っている:Fluent API - カスタムリレーションテーブルのマッピング方法

public class Group 
{ 
    public int Id {get; set;} 
    public ICollection<Group> IsMemberOf {get; set;} 
} 

グループは他のグループのメンバーになることができます。 Iddb私はテーブルGroupとテーブルGroupGroupを持っています。 ModelBuilderでは、このコードを使用してマッピングを定義します。

modelBuilder.Entity<GroupGroup>() 
      .ToTable("GroupGroup") 
      .HasKey(e => new { e.GroupId, e.MemberGroupId }); 
modelBuilder.Entity<Group>() 
      .ToTable("Group") 
      .Ignore(e => e.IsMemberOf); 

まあ、私の質問は流暢APIとプロパティIsMemberOfに関係テーブルGroupGroupからグループをマップする方法ですか?私はef、Fluent APIなどについては非常に新しいので、独自のリレーションテーブルを作成する必要があることを知っていますが、ADや他のシステムとの接続のためにこの方法を使用する必要があります。これを達成する方法はありますか?

ありがとうございました。

答えて

0

このGroupGroupアソシエーションテーブルのために多対多の関連が必要なようです。これをマッピングするための一つの方法は次のとおりです。

modelBuilder.Entity<Group>() 
    .HasMany(g => g.IsMemberOf) 
    .WithMany() 
    .Map(m => m.MapLeftKey("ChildGroupId") 
       .MapRightKey("GroupId") 
       .ToTable("GroupGroup") 
     ); 

あなたのクラスモデルにGroupGroupエンティティクラスを持っていないことを意味します。 EFはあなたのようなLINQ文の実行すると、必要なすべてのジョイン設定することでIsMemberOfコレクションを移入:あなたはあなたのマッピングでは、この行.Ignore(e => e.IsMemberOf)を持っている理由私にはわからない

var groups = context.Groups.Include(g => g.IsMemberOf).ToList(); 

を、それを削除する必要があります。あなたもマッピングを行うことができます

は、両方の方法を行く:

public class Group 
{ 
    public int Id {get; set;} 
    public ICollection<Group> IsMemberOf { get; set; } 
    public ICollection<Group> HasMembers { get; set; } 
} 

とマッピング:

modelBuilder.Entity<Group>() 
    .HasMany(g => g.IsMemberOf) 
    .WithMany(g => g.HasMembers) 
    .Map(m => m.MapLeftKey("ChildGroupId") 
       .MapRightKey("GroupId") 
       .ToTable("GroupGroup") 
     ); 
関連する問題