Sto usando EF Core 3.1 con il seguente codice
public void Update()
{
Client client = new Client();
client.ClientId = 1;
client.Name = "New Client 1";
dbContext.Entry<Client>(client).State = EntityState.Modified;
dbContext.Entry<Client>(client).Property(x => x.IdentityNumber).IsModified = false;
dbContext.SaveChanges();
}
che produce il seguente SQL e aggiorna correttamente la colonna
UPDATE [Client]
SET [Name] = @p0
WHERE [ClientId] = @p1;
SELECT @@ROWCOUNT;
Tuttavia, quando cambio ClientId = 4
che è una voce che è stata eliminata dal database, produce la stessa query SQL ma genera il seguente errore
L'operazione del database dovrebbe interessare 1 riga (s) ma in realtà ha interessato 0 righe. I dati potrebbero essere stati modificati o eliminati da quando le entità sono state caricate
Il messaggio di errore è chiaro ma non capisco perché non funziona come funziona SQL Server (0 righe interessate) e genera invece questo errore.
Come posso simulare il comportamento di SQL Server interessato da 0 righe usando EF Core?
Non voglio prima interrogare il database se la riga esiste e quindi aggiornare. Il codice sopra è un esempio. Nei miei metodi ho elenchi con molti client che devo aggiornare contemporaneamente e ci vuole molto tempo usando il primo controllo se esiste e quindi aggiorno.
Non voglio prima interrogare il database se la riga esiste e quindi aggiornare.
Questo è il nocciolo del tuo problema e il motivo dell'errore.
Il nostro approccio, e credo che sia comune, è quello di utilizzare Dapper durante la manipolazione di molti dati e limitare EF al caricamento -> Modifica -> Salva operazioni su singole o pochissime entità.