J'utilise EF Core 3.1 avec le code suivant
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();
}
qui produit le SQL suivant et met à jour la colonne avec succès
UPDATE [Client]
SET [Name] = @p0
WHERE [ClientId] = @p1;
SELECT @@ROWCOUNT;
Cependant, lorsque je change ClientId = 4
qui est une entrée qui a été supprimée de la base de données, elle produit la même requête SQL mais génère l'erreur suivante
L'opération de base de données devrait affecter 1 ligne (s) mais a réellement affecté 0 ligne (s). Les données peuvent avoir été modifiées ou supprimées depuis le chargement des entités
Le message d'erreur est clair mais je ne comprends pas pourquoi cela ne fonctionne pas car SQL Server fonctionne (0 ligne (s) affectée (s)) et renvoie à la place cette erreur.
Comment puis-je simuler le comportement de SQL Server affecté par 0 ligne (s) à l'aide d'EF Core?
Je ne veux pas interroger la base de données d'abord si la ligne existe, puis la mettre à jour. Le code ci-dessus est un exemple. Dans mes méthodes, j'ai des listes avec de nombreux clients que je dois mettre à jour en même temps et cela prend beaucoup de temps à le faire en utilisant la première vérification s'il existe et ensuite la mise à jour.
Je ne veux pas interroger la base de données d'abord si la ligne existe, puis la mettre à jour.
C'est le nœud de votre problème et la raison de l'erreur.
Notre approche, et je pense que c'est une approche courante, consiste à utiliser Dapper lors de la manipulation d'un grand nombre de données et à limiter EF à Load -> Edit -> Save operations sur une ou très peu d'entités.