Ich verwende EF Core 3.1 und habe den folgenden Code
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();
}
Dadurch wird die folgende SQL erstellt und die Spalte erfolgreich aktualisiert
UPDATE [Client]
SET [Name] = @p0
WHERE [ClientId] = @p1;
SELECT @@ROWCOUNT;
Wenn ich jedoch die ClientId = 4
der es sich um einen Eintrag handelt, der aus der Datenbank gelöscht wurde, wird dieselbe SQL-Abfrage erstellt, es wird jedoch der folgende Fehler ClientId = 4
Der Datenbankvorgang wird voraussichtlich 1 Zeile (n) betreffen, tatsächlich jedoch 0 Zeile (n). Daten wurden möglicherweise geändert oder gelöscht, seit Entitäten geladen wurden
Die Fehlermeldung ist klar, aber ich verstehe nicht, warum sie nicht so funktioniert wie SQL Server (0 betroffene Zeile (n)) und löst stattdessen diesen Fehler aus.
Wie kann ich mit EF Core das von 0 Zeilen betroffene SQL Server-Verhalten simulieren?
Ich möchte die Datenbank nicht zuerst abfragen, wenn die Zeile vorhanden ist, und dann aktualisieren. Der obige Code ist ein Beispiel. In meinen Methoden habe ich Listen mit vielen Clients, die ich sofort aktualisieren muss, und es dauert lange, dies zu tun, indem zuerst geprüft wird, ob vorhanden, und dann aktualisiert wird.
Ich möchte die Datenbank nicht zuerst abfragen, wenn die Zeile vorhanden ist, und dann aktualisieren.
Dies ist der Kern Ihres Problems und der Grund für den Fehler.
Unser Ansatz, und ich glaube, ein allgemeiner, besteht darin, Dapper bei der Bearbeitung vieler Daten zu verwenden und EF auf Laden -> Bearbeiten -> Speichern von Vorgängen für einzelne oder sehr wenige Entitäten zu beschränken.