0

ich ein many-to-many-Beziehung zwischen Eltern und Childs habe eine Beziehungstabelle verursacht diese Beziehungen mit nicht automatisch in EF-Core unterstützt noch:Fügen Sie Entity von generischer Listeneigenschaft in ASP.NET EntityFramework Kern

class Parent{ 
    [Key] 
    public int Id{get;set;} 
    public List<ParentChild> ParentChilds{get;set;} 
} 

class Child{ 
    [Key] 
    public int Id{get;set;} 
    public List<ParentChild> ParentChilds{get;set;} 
} 

class ParentChild{ 
    public int ParentId{get;set;} 
    public Parent Parent{get;set;} 
    public int ChildId{get;set;} 
    public Child Child{get;set;} 
} 

Zum Bearbeiten des Elternteils muss ich ALLE seiner Kinder erhalten. Es scheint wie ein Job für Include()

var db = new MyDbContext(); 
var parentWithChilds = db.Parents.Include(p => p.ParentChilds) 
    .FirstOrDefault(p => p.Id == 1); 

Dies gab mir die Liste der ParentChild ntfernungen. Aber die Child Einheit von ParentChild wird nicht automatisch geladen, so dass ich nur die ID des Kindes habe, aber nicht das Kind-Objekt selbst, das für mich benötigt wird. Ich fand ThenInclude die für solche Fälle und von Beispielen wie this ich habe folgendes entworfen zu sein scheint:

var parentWithChilds = db.Parents.Include(p => p.ParentChilds) 
    .ThenInclude(p => p.Select(x => x.Child)) 
    .FirstOrDefault(p => p.Id == 1); 

Aber es gibt eine Ausnahme aus:

Die Eigenschaft Ausdruck ‚p => {von Parentchild x in p wähle [x] .Kild => FirstOrDefault()} ist nicht gültig. Der Ausdruck sollte einen Eigenschaftenzugriff darstellen: 't => t.MyProperty'.

Also wie kann das gemacht werden? Ich mag unnötige Rückfragen vermeiden, wie das Unternehmen manuell auf diese Weise holen:

user.ParentChilds.ForEach(pc => pc.Child = db.Childs.FirstOrDefault(x => x.Id == pc.ChildId)); 

Antwort

2

Scheint, wie ich die Verwendung von ThenInclude falsch verstehen, da es auf die Untereinheit bezieht. eine Liste seiner möglichen, die die Einheit zu definieren, auch wie diese auf Listen zu laden:

var parentWithChilds = db.Parents.Include(p => p.ParentChilds) 
    .ThenInclude(p => p.Child) 
    .FirstOrDefault(p => p.Id == 1); 

Visual Studio Probleme hat jene Überlastung in Intellisense, aber seine dort zeigen und zu Fehlern nicht zur Folge hätte.

+3

'.ThenInclude' hat zwei Überladungen (wenn eine Navigationseigenschaft einer Sammlung verfolgt wird). Eine für "TPreviousProperty" und eine für "ICollection ". Für einige Leute scheint Visual Studio immer Intellisense für die 'TPreviousProperty' -Variante zu zeigen und nur die Sammlungs-Erweiterungsmethoden und nicht das Modell zu zeigen. Aber wenn man den Eigenschaftsnamen ohne Autocomplete eintippt, wählt man dann das richtige (wie bei '.ThenInclude (p => p.Child)') und zeigt keinen Compilerfehler an. – Tseng

+0

Ja das war das Problem, ich habe nicht Zuerst bemerkte ich die Überlastung, weil sie in IntelliSense fehlte. – Lion

Verwandte Themen