2017-12-09 2 views
1

Ich habe eine Viele zu Viele Beziehung zwischen 2 Objekten definiert. Jedes Objekt stellt die gleiche Navigationseigenschaft zur Verfügung, damit ich die Beziehungen nach Code durchqueren kann. Das Setup ist wie folgt;EF 6 Viele zu viele Navigation-Eigenschaft 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; } 
    } 

und dies in meinem Kontext;

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

} 

Allerdings, wenn ich versuchen, eine Nachricht zu laden, die mehrere Gruppen hat (Datensätze korrekt sind in MessageGroup Tabelle) nur die Messages gezeigt. Für Informationen lade ich diese durch die Messages DbSet. Wenn ich dann die Gruppe durch das Groups DbSet lade, passiert das Umgekehrte, und nur die Groups werden angezeigt.

geladen von Nachrichten DbSet;

enter image description here

aus Gruppe DbSet geladen wird;

enter image description here

Ich kann beide erhalten durch die MessageGroup DbSet mit und einschließlich ihnen;

aber ich möchte in der Lage sein, meine Nachricht oder Gruppe zu laden und diese verfügbar zu haben.

Zur Information, mein Kontext ist um eine andere Schicht gewickelt und ich habe ein paar Methoden für jeden Typ freigelegt, aber letztendlich rufe ich an;

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

Mögliches Duplikat [C# Entity-Framework: Wie kann Ich kombiniere ein .Find und .Include auf einem Model Object?] (Https://StackOverflow.com/questions/7348663/c-sharp-entity-framework-how-can-i-combine-a-find-and-include -on-a-model-obje) – Progman

+0

Beim Laden einer Auflistungsnavigationseigenschaft wird auch die Eigenschaft der inversen Navigation geladen. Um eine andere Eigenschaft zu laden, müssen Sie diese explizit "Include" hinzufügen. Oder da die Navigationseigenschaften der Sammlung "virtuell" sind (also lazy loaded), sollten Sie auch die 'MessageGroup'-Navigationseigenschaften' virtual' machen. –

+0

@Progman, ja ich weiß, Sie können sie einschließen, aber meine spezifische Frage war, wie man sie zur Verfügung stellt, ohne dies zu tun. Danke – ChrisBint

Antwort

2

Wenn eine Navigationseigenschaft der Sammlung geladen wird, lädt die EF-Navigationseigenschaftskorrektur auch die entsprechende inverse Navigationseigenschaft. Andere Navigationseigenschaften müssen jedoch explizit geladen werden (eifrig, explizit oder faul).

Da Sie auf verzögertes Laden zu verlassen scheinen die MessageGroups Sammlung Navigationseigenschaften, sollten Sie die inversen Referenznavigationseigenschaften in MessageGroupvirtual machen:

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