Convertir la vue en tables et enregistrer les modifications me donne une exception de concurrence optimiste

StackOverflow https://stackoverflow.com//questions/10689972

Question

Je travaille avec Entity Framework 4 (en utilisant des entités d'auto-suivi) et j'accède à une vue, c'est-à-dire la fusion de deux tables.Ainsi lorsque je mets à jour les informations de la vue, j'envoie le STE de la vue au référentiel qui accède à la base de données.

J'ai fait ce qui suit :

Lorsque je reçois ma vue avec les informations mises à jour, je crée mes STE1 et STE2.Comment, lorsque je crée un STE, celui-ci est créé avec un état ajouté.Alors comment je connais pour l'état du STE du point de vue que l'état est modifié, je change l'état de mes deux STE avec la méthode MarkedAsModified.

Ensuite, comme j'ai dans le STE de la vue les informations des deux tables, je transmets les informations de la vue au bon STE et j'applique les modifications du STE au objectContext.

Finalement je fais le saveChanges.Mais à cette étape, je reçois un Optimistic concurrency exception.Je pense que c'est parce que les STE passent de l'Etat à Added à Modified le contexte détecte donc qu'il y a une modification entre la création et le SaveChanges, mais j'essaie aussi de AcceptChanges dans le STE, marqué plus tard comme modifié et, appliquer les modifications et enfin SaveChanges, mais le problème persiste.

Comment puis-je résoudre le problème ?existe-t-il une meilleure façon de travailler avec View et Entity Framework v4 ?

Merci.Daimroc.

MODIFICATION 1 :J'ai encore des problèmes.Mon code est le suivant :

Composants myComponent = new Components();// Ceci est un Ste MyComponent.rereference = MyView.Reference;...// Autres propriétés MyComponent.markedAmModified ();// ceci est nécessaire car je souhaite mettre à jour les informations, pas ajouter de nouveau registre.monContext.ApplyChanges("Composants", monComponent);miContexto.SaveChanges();

Dans les saveChanges, j'obtiens l'exception :L'instruction update, insert ou delete a affecté un nombre inattendu de lignes (0).Les entités peuvent avoir été modifiées ou supprimées depuis leur chargement.Actualisez les entrées ObjectStateManager.

Quel est le problème ?puis-je ne pas modifier un nouveau STE créé ?

Merci.

Était-ce utile?

La solution

J'ai trouvé le moyen de résoudre le problème.

Dans une première solution, la solution consistait à faire une requête à la base de données pour obtenir les registres existants dans la base de données.Cela ajoute les entités dans le contexte et il est alors possible de modifier les données et d'enregistrer les modifications correctement.

Mais plus tard, j'ai trouvé le moyen d'éviter de devoir interroger la base de données pour ajouter les entités modifiées dans le contexte.

La méthode utilise le code suivant :

Customers myCustomer = new Customers  { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);

//update the data of the entity.

myContext.SaveChanges();

La solution consiste à créer une nouvelle entité définissant la clé primaire.Si l'entité avait FK, cela serait indiqué de la même manière.À ce stade, l’entité possède l’état ajouté.

Plus tard, est attaché au contexte, puis peut être modifié.Lorsqu'un champ est modifié, l'entité change son état en modifié, donc lorsque saveChanges() est appelé, EF met à jour l'entité, n'essaye pas d'en ajouter une nouvelle.

Je trouve cette information dans ceci lien.Dans cet article, la solution consiste à supprimer une entité sans la récupérer dans la base de données, mais l'idée fonctionne également si l'on souhaite modifier un registre existant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top