Parent hat eine Eigenschaft LastChildrenName
und eine Liste der Children.
parent.Children.Add(new Children(){ Name = "FirstChild" };
parent.Children.Add(new Children(){ Name = "SecondChild" };
parent.Children.Add(new Children(){ Name = "ThirdChild" };
DbContext.Set<Parent>.Update(parent);
DbContext.SaveChanges();
DbContext.SaveChanges();
Beim Debuggen vor dem ersten Aufruf von SaveChanges () hat der LastChildrenName
einen korrekten Wert von ThirdChild
aber nach SaveChanges()
nur die neue Children Zeile in der db und die LastChildrenName
Spalte hat den Wert SecondChild
.
Der nächste Aufruf von SaveChanges()
in der nächsten Codezeile führt dazu, dass die Spalte LastChildrenName
des übergeordneten LastChildrenName
mit dem richtigen Wert aktualisiert wird.
Aber es verursacht auch, den Update-Trigger zweimal in der Parent-Tabelle zu erhöhen, die ich vermeiden möchte.
Fehle ich eine EF Core-Einstellung oder eine Möglichkeit, die im Parent-Modell verwendet werden kann, um in der Datenbank nur einmal zu aktualisieren? Ich möchte auch vermeiden, die get
Methode der LastChildrenName -Eigenschaft zu ändern.
public class Parent
{
public int Id;
public ICollection<Children> Childrens {get;set;}
public string LastChildrenName => this.Childrens.OrderBy(x => x.Id).Select(x => x.Name).LastOrDefault(x => !string.IsNullOrWhiteSpace(x));
}
Kindermodell:
public class Children
{
public int Id;
public string Name;
public Parent Parent;
}
OrderBy(x => x.Id)
Kinder nach ID, aber bevor die Kinder in der Datenbank gespeichert werden, haben sie noch keine bekannte ID. Daher wird zunächst den einfachen Fall zu nehmen, wenn FirstChild
und SecondChild
sind bereits mit IDs gespeichert 1
und 2
, und Ihre ThirdChild
wird den Kontext hinzugefügt , aber noch nicht gesichert, dass die dritte Kind als ID mit zu sehen sein wird 0
, so würde es machen SecondChild
dass SecondChild
immer noch die höchste ID hat.
Wenn Sie nur ein Kind gleichzeitig hinzufügen, können Sie Ihre OrderBy
so ändern, dass 0
immer als letztes OrderBy
wird. Sie können beispielsweise OrderBy(x => x.Id == 0).ThenBy(x => x)
.
Wenn Sie mehrere Kinder gleichzeitig hinzufügen, glaube ich nicht, dass dies überhaupt funktionieren wird, da es keine Garantie gibt, dass Entitäten in einer bestimmten Reihenfolge in der Datenbank gespeichert werden. Sie müssten zum Generieren von IDs auf dem Client anstatt auf dem Server wechseln, damit dieser Ansatz funktioniert. Alternativ können Sie stattdessen ein Erstellungsdatum / eine Erstellungszeit und -reihenfolge hinzufügen.