Bonjour,
je rencontre un souci dans l'utilisation de EF 4 en mode DB First.
J'ai une liste de Catégorie, qui comprend une liste d'actions, chaque action comprend une liste d'ActionAfficheur (relation 1 - n dans les deux cas donc).
Je charge mes données depuis un contexte A dans un usage WPF (application 2 tiers : Affichage et entités).
le chargement des données n'est pas un souci, je crée mon premier contexte A pour cela. Suite à des modifications, je veux sauvegarder mes données, donc j'ouvre un nouveau contexte, le B.
Si je ne fais que modifier des propriétés type String dans ces classes, pas de souci. Mais si j'ajoute un nouvel objet ActionAfficheur à une instance d'Actions existante, je reçois une exception, dépendant de comment je procède pour sauvegarder.
Si je tente de sauvegarder en partant de la liste terminale des ActionAfficheur après un selectMany pour les récupérer, je reçois l'erreur suivante (après un appel à AddObject) :
et l'entityKey passe d'une valeur générée et d'un EntityState added à null & detached...The EntityKey property can only be set when the current value of the property is null.
Si je tente de sauvegarder en partant de la liste des categories en iterant dessus, lors que je traite la catégorie qui comprend l'action qui a reçu un nouvel ActionAfficheur, je recois l'erreur suivante :
et l'entityKey est passé de unchanged à null & detached.An object with a temporary EntityKey value cannot be attached to an object context.
Pour la catégorie, je fail sur le Attach, pour le nouvel ActionAfficheur, je fail sur le Add
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /// C'est le même corps de fonction pour la mise à jour des Categorie, Action et ActionAfficheur, en remplacant juste la liste de destination public void Update(OPIAEntities context) { if (this.EntityKey == null || this.EntityKey.IsTemporary || this.EntityKey.EntityKeyValues == null) context.Categorie.AddObject(this); //Si c'est nouvel item, je l'ajoute à ma liste else { try { context.Categorie.Attach(this); } catch(Exception ex) {//Debug } if (this.MarkAsDeleted == false) context.ObjectStateManager.ChangeObjectState(this, System.Data.EntityState.Modified); else context.DeleteObject(this); } }
Merci pour votre aide
Partager