2017-12-09 16 views
1

2つのオブジェクト間に多対多の関係を定義しました。各オブジェクトは、コードで関係をトラバースするために、同じNavigationプロパティを公開します。設定は次のとおりです。EF 6多対多ナビゲーションプロパティnull

public class Message : Entity<int> 
    { 
     public int UserId { get; set; } 

     public User User { get; set; } 

     public Guid Reference { get; set; } = Guid.NewGuid(); 

     public virtual ICollection<MessageGroup> MessageGroups { get; set; } = new HashSet<MessageGroup>(); 
    } 
} 

    public class Group : Entity<int> 
    { 
     public int UserId { get; set; } 

     public User User { get; set; } 

     public Guid Reference { get; set; } = Guid.NewGuid(); 

     public virtual ICollection<MessageGroup> MessageGroups { get; set; } = new HashSet<MessageGroup>(); 

    } 

public class MessageGroup 
    { 
     public int MessageId { get; set; } 

     public Message Message { get; set; } 

     public int GroupId { get; set; } 

     public Group Group { get; set; } 
    } 

これは私の状況です。私は複数のグループを(レコードがMessageGroup表に正しい)を有しているメッセージをロードしようとすると

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 

       modelBuilder.Entity<MessageGroup>() 
         .HasKey(bc => new { bc.GroupId, bc.MessageId }); 

       modelBuilder.Entity<MessageGroup>() 
        .HasRequired(bc => bc.Group) 
        .WithMany(b => b.MessageGroups) 
        .HasForeignKey(bc => bc.GroupId) 
        .WillCascadeOnDelete(false); 

       modelBuilder.Entity<MessageGroup>() 
        .HasRequired(bc => bc.Message) 
        .WithMany(c => c.MessageGroups) 
        .HasForeignKey(bc => bc.MessageId) 
        .WillCascadeOnDelete(false); 

} 

しかし、唯一Messagesが示されています。情報については、Messages DbSetでロードしています。 Groups DbSetを使用してグループをロードすると、逆のことが起こり、Groupsのみが表示されます。

メッセージから読み込みDbSet;グループDbSetからロード

enter image description here

enter image description here

私はMessageGroup DbSetを使用して、それらを含めることで、両方を取得することができます。

var messageGroups = context.MessageGroups.Where(x => x.MessageId == id).Include(x => x.Group).Include(x => x.Message).ToList(); 

しかし、メッセージやグループを読み込んで利用できるようにしたいと考えています。

私のコンテキストは別のレイヤーにラップされていますが、各タイプごとにいくつかのメソッドが公開されていますが、最終的には呼び出しています。

public T Get(U id) 
     { 
      return _dbSet.Find(id); 
     } 
+0

[C#エンティティフレームワークの可能性の重複:どのようにすることができます私はモデルオブジェクトに.Findと.Includeを組み合わせますか?](https://stackoverflow.com/questions/7348663/c-sharp-entity-framework-how-can-i-combine-a-find-and-include -on-a-model-obje) – Progman

+0

コレクションナビゲーションプロパティを読み込むときに、逆ナビゲーションプロパティも読み込まれます。他のプロパティを読み込むには、明示的に 'Include'する必要があります。あるいは、コレクションのナビゲーションプロパティが 'virtual'(したがって遅延ロードされている)なので、あなたは' MessageGroup'ナビゲーションプロパティも 'virtual'にする必要があります。 –

+0

@Progman、はい私はあなたがそれらを含めることができることを知っていますが、私の具体的な質問はそうすることなくそれらを利用可能にする方法でした。ありがとう – ChrisBint

答えて

2

コレクションナビゲーションプロパティが読み込まれると、EFナビゲーションプロパティのフィックスアップによって、対応する逆ナビゲーションプロパティも読み込まれます。しかし、他のナビゲーションプロパティを明示的に読み込む必要があります(熱心な、明示的または怠惰な)。

あなたは遅延ロードMessageGroupsコレクションナビゲーションプロパティに依存しているように見えるので、あなたもMessageGroupvirtualで逆参照ナビゲーションプロパティを作成する必要があります。

public class MessageGroup 
{ 
    public int MessageId { get; set; } 

    public virtual Message Message { get; set; } 

    public int GroupId { get; set; } 

    public virtual Group Group { get; set; } 
} 
関連する問題