Il genitore ha una proprietà LastChildrenName
e un elenco dei childrens.
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();
Durante il debugging prima della prima chiamata di SaveChanges (), LastChildrenName
ha il valore corretto di ThirdChild
tuttavia, dopo SaveChanges()
solo la nuova riga Children appare nel db e la colonna LastChildrenName
ha il valore SecondChild
.
Richiamando SaveChanges()
subito dopo, nella riga successiva del codice, la colonna del genitore LastChildrenName
viene aggiornata con il valore corretto.
Ma causa anche l'aumento dell'attivazione dell'aggiornamento due volte nella tabella padre che voglio evitare.
Mi manca un'impostazione EF Core o un modo che può essere utilizzato sul modello Parent per aggiornare nel db una sola volta? Vorrei anche evitare di cambiare il metodo get
della proprietà LastChildrenName.
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));
}
Modello per bambini:
public class Children
{
public int Id;
public string Name;
public Parent Parent;
}
OrderBy(x => x.Id)
ordina i bambini per ID, ma prima che i bambini vengano salvati nel database, non hanno ancora un ID noto. Pertanto, per prendere per primo il caso semplice, se FirstChild
e SecondChild
sono già salvati con ID 1
e 2
, e il tuo ThirdChild
viene aggiunto al contesto ma non ancora salvato, quel terzo figlio verrà visto come avente ID 0
, quindi farebbe sentiamo che SecondChild
è ancora visto come avente l'ID più alto.
Se aggiungi sempre un figlio alla volta, puoi modificare il tuo OrderBy
modo che lo 0
appaia sempre per ultimo. Ad esempio, puoi scrivere OrderBy(x => x.Id == 0).ThenBy(x => x)
.
Se si aggiungono più bambini contemporaneamente, non penso che funzionerà affatto, perché non vi è alcuna garanzia che le entità vengano salvate nel database in un ordine particolare. Dovresti passare a generare ID sul client piuttosto che sul server per far funzionare questo approccio. In alternativa, è possibile aggiungere una data / ora di creazione e l'ordine da quello.