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;
aus Gruppe DbSet geladen wird;
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);
}
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
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. –
@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