357 votes

Entity Framework: "Store update, insert ou delete touché un nombre inattendu de lignes (0)."

Je suis en utilisant Entity Framework pour remplir une grille de contrôle. Parfois quand je fais des mises à jour, j'obtiens l'erreur suivante:

Store update, insert ou delete touché un nombre inattendu de lignes (0). Les entités peuvent avoir été modifiés ou supprimés depuis entités ont été chargés. Actualiser Vousmanager entrées.

Je ne peux pas comprendre comment reproduire ce. Mais il pourrait avoir quelque chose à voir avec la façon dont rapprochés-je faire les mises à jour. Quelqu'un a vu cette ou personne ne sait ce que le message d'erreur fait référence à?

Edit: Malheureusement, je ne suis plus à la liberté de reproduire le problème que j'ai ici, parce que j'ai renoncé à ce projet et ne me souviens pas si j'ai finalement trouvé une solution, si un autre développeur, il fixe, ou si j'ai travaillé autour d'elle. Donc je ne peux pas accepter toutes les réponses.

420voto

webtrifusion Points 1948

J'ai couru dans cette et il a été causé par l'entité ID (clé) le terrain n'étant pas défini. Ainsi, lorsque le contexte est allé à enregistrer les données, il ne pouvait pas trouver un ID = 0. Assurez-vous de placer un point d'arrêt dans votre instruction de mise à jour et de vérifier que l'entité ID a été défini.

De Paul Bellora commentaire

J'ai eu exactement ce problème, causé par oublier d'inclure le caché ID entrée dans l' .cshtml modifier la page

219voto

fyjham Points 3864

C'est un effet secondaire d'une fonctionnalité appelée l'accès concurrentiel optimiste.

Pas 100% sûr de la façon de l'activer/désactiver dans le Cadre de l'Entité, mais, fondamentalement, ce qu'il vous dit, c'est que entre le moment où vous avez saisi les données de la base de données et lorsque vous avez enregistré vos modifications quelqu'un d'autre a modifié les données (ce Qui signifie quand vous êtes allé à l'enregistrer 0 lignes réellement obtenu mis à jour). Dans SQL termes de leur requête de mise à JOUR de la clause where contient la valeur d'origine de chaque champ dans la ligne, et si 0 lignes sont affectées, il sait que quelque chose ne tourne pas rond.

L'idée derrière cela est que vous ne finirez pas remplacer une modification de votre application ne sais pas qui s'est passé - il s'agit essentiellement d'un peu de mesure de sécurité pour jetés par .NET sur toutes vos mises à jour.

Les chances sont qu'il est dans votre propre logique que ça se passe, si c'est cohérent (exemple: Vous êtes en fait la mise à jour vous-même vos données dans une autre méthode entre la sélection et la mise à jour), mais il pourrait simplement s'agir d'une condition de concurrence entre les deux applications.

121voto

Ben Points 727

Wow, beaucoup de réponses, mais j'ai cette erreur quand j'ai fait quelque chose de légèrement différent que pas sur d'autre a mentionné.

Longue histoire courte, si vous créez un nouvel objet et dire EF que ses modifiée à l'aide de l' EntityState.Modified alors qu'il va jeter cette erreur car il n'existe pas encore dans la base de données. Voici mon code:

MyObject foo = new MyObject()
{
    someAttribute = someValue
};

context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();

Oui, cela semble idiot, mais il se pose parce que la méthode en question l'habitude d'avoir foo passé qu'il a été créé plus tôt, maintenant il ne dispose que d' someValue passé et crée foo lui-même.

Facile à fixer, il suffit de changer EntityState.Modified de EntityState.Added ou de changement que l'ensemble de la ligne:

context.MyObject.Add(foo);

24voto

Leniel Macaferi Points 38324

J'ai été confronté à ce même effrayer erreur... :) Puis j'ai réalisé que je commençais à oublier pour définir un

@Html.HiddenFor(model => model.UserProfile.UserId)

pour la clé primaire de l'objet mis à jour! J'ai tendance à oublier cette simple, mais très important bidule!

Par la route: HiddenFor est pour ASP.NET MVC.

16voto

Solly Points 151

Vérifiez si vous avez oublié le "DataKeyNames" attribut dans le contrôle GridView. c'est un must lors de la modification de données dans le contrôle GridView

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X