2010-10-27 3 views
2

Après avoir essayé plusieurs options d'avoir un mécanisme décent qui permet d'utiliser ObservableCollections avec l'option de les mettre à jour dynamiquement en utilisant une fenêtre et une liaison Edit, sans avoir les collections globales mises à jour contrôles, jusqu'à présent, la meilleure solution semble être: cloner l'entité, détacher l'ancien, attacher le nouveau, marquez-le mis à jour et enregistrer.Entity Framework Attacher une exception après le clonage

Mais oups, l'exception suivante suit:

The relationship manager supplied by the object implementing IEntityWithRelationships is not the expected relationship manager. 

Est-ce que quelqu'un sait comment résoudre ce problème? - Veuillez ne pas proposer d'utiliser la sérialisation, la réflexion ou le clonage d'entité de Matthieu MEZIL à partir du problème de performance (cela prend plusieurs secondes pour copier l'ensemble du graphique d'entité).

Merci, Oran

Répondre

2

Je doute votre approche. "prend quelques secondes pour copier l'ensemble du graphe d'entité" devrait sonner quelques cloches d'alarme. Il semble que vous stockiez la plupart de vos données dans la mémoire. Juste parce que vous pouvez ne signifie pas que vous devriez. Je voudrais essayer de re-architecte, vous utilisez le chargement différé.

Cependant, cela étant dit, utilisez-vous des entités découplées (approche POCO)? Cela pourrait aider à cet égard, car ils se découplent du contexte plus et cela pourrait vous donner la possibilité de faire entrer et sortir des entités du contexte.

+0

Merci. J'ai vérifié le contexte de mon objet et je me suis assuré que le chargement est paresseux. Alors quoi d'autre pourrait-il faire que mon graphe d'entité complète soit chargé? – OrPaz

+0

Eh bien en interrogeant simplement la propriété que vous chargez effectivement. Itérer sur le graphe d'objet fera cela, peut-être que votre sérialiseur appelle des charges db quand il reflète les propriétés. – Slappy

+0

Merci. Votre réponse m'amène à la solution. Je vais poster la réponse avec des détails. – OrPaz

2

La réponse ci-dessus (Slappy) m'a conduit à la solution. Voici une explication complète:

  1. Pour modifier une entité et non effectuer les contrôles observables qui y sont liés, je voulais juste cloner l'entité, effectuer des modifications, le joindre au contexte de l'objet et sauver . Mais je me suis cogné la tête contre le mur car je n'ai pas réussi à ce que l'on appelle une opération simple en utilisant le .NET MemberWiseClone() par défaut ou toute autre procédure de clonage que j'ai trouvée. Lorsque j'ai sérialisé l'objet, j'ai réussi, mais avec un problème majeur: Il a fallu plusieurs secondes pour sérialiser un objet, ce qui était impossible en dehors des problèmes de performance. Ensuite, la réponse Slappy m'a amené à réaliser que je n'avais pas appris assez le comportement du contexte d'objet et comment il gère le modèle d'entité. Quand j'ai regardé attentivement les documents et suivi le comportement de l'entité, j'ai réalisé que je me contredis - j'ai essayé d'effectuer un Deep Clone sur une entité contextuelle 'live' et 'attachée', une chose qui a pris plusieurs secondes mes données.

  2. La procédure suivante a résolu mon problème: je téléchargé le (super!) Cloner entité de Matthieu MEZIL (http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx), et a utilisé le CloneEntityWithGraph pour cloner entièrement l'entité, mais cette fois avec une différence: je l'ai détaché la entité avant d'essayer de le cloner. Bien entendu, l'entité a été instantanément clonée avec tout son graphe d'une manière qui pourrait être appliquée plus tard à l'entité originale comme suit. Après avoir effectué les changements, je l'ai utilisé le code ci-dessous pour enregistrer avec succès les modifications:

    objectContext.ApplyCurrentValues(<ObjectSet Name>,<Cloned And Edited Entity>); objectContext.SaveChanges();

Ca y est! L'entité a été enregistrée dans la base de données avec succès.Je préfère cette approche de l'approche POCO ou de coder en dur une modification dans les propriétés d'entités spécifiques car elle est générale et (devrait) être généralement applicable à toutes mes entités sans aucun codage spécifique pour une entité.

Merci pour toute l'aide, Oran