Ho due entità, una è quella nel database, l'altra è il nuovo valore che ho ricevuto dal controller.
Ora voglio aggiornare l'entità nel Database senza specificare tutte le diverse proprietà;
Invece di:
public async Task UpdateFoo(Foo fooNew){
Foo fooDb = await context.Foo
.Include(f => f.Child)
.Where(f => f.Id == 1)
.FirstOrDefaultAsync();
fooDb.Value01 = fooNew.Value01;
fooDb.Value02 = fooNew.Value02;
fooDb.Child.ValueA = fooNew.Child.ValueA;
context.SaveChangesAsync()
}
Voglio fare qualcosa di simile;
public async Task UpdateFoo(Foo fooNew){
Foo fooDb = await context.Foo
.Include(f => f.Child)
.Where(f => f.Id == 1)
.FirstOrDefaultAsync();
fooDb = fooNew;
context.SaveChangesAsync()
}
Ho provato a usare CurrentValues.SetValues;
context.Entry(fooDb).CurrentValues.SetValues(fooNew);
Ciò genera un errore a causa della chiave contrassegnata come modificata;
La proprietà "Id" sul tipo di entità "Foo" fa parte di una chiave e quindi non può essere modificata o contrassegnata come modificata.
C'è un modo per sovrascrivere e salvare tutte le proprietà dell'entità (e le proprietà figlio dell'entità) senza specificarle una per una?
Che ne dici di iniziare collegando il modello a un DbSet<T>
poi dicendo a EF tracker di aggiornare tutti i suoi campi ogni volta che chiami .SaveChanges()
Il codice di esempio è simile a questo.
public async Task UpdateFoo(Foo foo_updated)
{
foo_updated = context.Set<Foo>()
.Attach(foo_updated);
context.Entry(foo_updated).State = EntityState.Modified;
context.Entry(foo_updated.Child).State = EntityState.Modified;
context.SaveChangesAsync()
}