Entity Framework: "L'instruction de mise à jour, d'insertion ou de suppression de magasin a affecté un nombre inattendu de lignes (0)."

entity-framework

Question

J'utilise Entity Framework pour remplir un contrôle de grille. Parfois, lorsque je fais des mises à jour, j'obtiens l'erreur suivante:

L'instruction Store update, insert ou delete a affecté un nombre inattendu de lignes (0). Les entités peuvent avoir été modifiées ou supprimées depuis le chargement des entités. Actualisez les entrées ObjectStateManager.

Je n'arrive pas à comprendre comment reproduire cela. Mais cela pourrait avoir un lien avec la proximité des mises à jour. Est-ce que quelqu'un a vu cela ou est-ce que quelqu'un sait à quoi se réfère le message d'erreur?

Edit: Malheureusement, je ne suis plus libre de reproduire le problème que je rencontrais ici, car je me suis éloigné de ce projet et je ne me souviens pas si j’ai finalement trouvé une solution, si un autre développeur l’a corrigée ou si j’ai corrigé le problème. Par conséquent, je ne peux accepter aucune réponse.

Réponse acceptée

C'est un effet secondaire d'une fonctionnalité appelée concurrence simultanée optimiste.

Vous ne savez pas comment l’activer / le désactiver dans Entity Framework, mais en gros, il vous dit qu’entre le moment où vous avez extrait les données de la base de données et le moment où vous avez enregistré vos modifications, une autre personne a modifié les données pour le sauvegarder 0 lignes ont été mises à jour). En termes SQL, la clause where de leur requête de update contient la valeur d'origine de chaque champ de la ligne, et si 0 ligne est affectée, il sait que quelque chose s'est mal passé.

L'idée sous-jacente est que vous ne finirez pas par écraser un changement que votre application ne savait pas déjà arrivé - il s'agit fondamentalement d'une petite mesure de sécurité introduite par .NET dans toutes vos mises à jour.

Si c'est cohérent, il y a de fortes chances que cela se produise dans votre propre logique (EG: vous mettez à jour les données vous-même selon une autre méthode entre select et update), mais il pourrait simplement s'agir d'une situation de concurrence critique entre deux applications.


Réponse populaire

J'ai rencontré ceci et cela était dû au fait que le champ ID (clé) de l'entité n'était pas défini. Ainsi, lorsque le contexte est allé sauvegarder les données, il n'a pas pu trouver un ID = 0. Assurez-vous de placer un point de rupture dans votre instruction de mise à jour et de vérifier que l'ID de l'entité a été défini.

Du commentaire de Paul Bellora

J'ai eu ce problème exact, en oubliant d'inclure l'entrée d'identifiant masqué dans la page d'édition .cshtml



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow