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));
'.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
Ja das war das Problem, ich habe nicht Zuerst bemerkte ich die Überlastung, weil sie in IntelliSense fehlte. – Lion