2010-06-08 6 views
1

J'essaie de créer une méthode sur un référentiel EF 4 POCO appelé AddOrUpdate. L'idée est que la couche de gestion peut transmettre un objet POCO et que l'infrastructure de persistance ajoute l'objet s'il est nouveau (pas encore dans la base de données), sinon la base de données sera mise à jour (une fois SaveChanges() avec la nouvelle valeur. Ceci est similaire à d'autres questions que j'ai posées sur EF, mais je ne suis qu'environ 80% à comprendre cela, alors s'il vous plaît pardonner la duplication partielle. La partie qui me manque est comment mettre à jour le graphe d'objet dans mon objet ObjectContext/associé pour l'objet métier transmis une fois que j'ai déterminé que l'objet métier existe déjà dans la base de données (et qu'il a été chargé) merci à TryGetObjectByKey). ApplyCurrentValues ​​ressemble un peu à ce que je veux, mais il ne copie que les valeurs scalaires et ne semble pas destiné à mettre à jour le graphe d'objet dans ObjectContext/ObjectSet. En raison de mon cas d'utilisation particulier, je ne me soucie pas de la concurrence en ce moment.EF 4, POCO et AddOrUpdate

public void AddOrUpdate(BO biz) 
{ 
    object obj; 

    EntityKey ek = Ctx.CreateEntityKey(mySetName, biz); 
    bool found = Ctx.TryGetObjectByKey(ek, out obj); 

    if (found) 
    { 
     // How do I do what this method name implies? Biz is a parent with children. 
     mySet.TellTheSetToUpdateThisObject(biz); 
    } 
    else 
    { 
     mySet.AddObject(biz); 
    } 

    Ctx.DetectChanges(); 
} 

Répondre

0

Le problème était que mes objets métier utilisaient l'opérateur new() pour allouer des objets enfants, plutôt que de construire l'objet à partir de ObjectContext. Pas vraiment de comportement POCO si vous ne pouvez pas utiliser new(), mais au moins cela fonctionne après un refactoring.

0

Vous devez écrire du code pour cela. Il n'y a rien construit dans lequel copie un graphique entier. Comme vous le dites, ApplyCurrentValues fonctionnera correctement pour les valeurs scalaires. Les enfants, vous devrez vous copier.

+0

@Craig: Donc si je charge un parent POCO qui a des enfants (et peut-être des petits-enfants, etc.) via EF 4, change certains objets enfants (modifie ceux existants, en ajoute de nouveaux, supprime), je dois manuellement mettre à jour le graphe d'objet dans ObjectContext? –

+0

Non. Si vous chargez à partir du contexte et que les entités effectuent une certaine forme de suivi des modifications, ceci est automatique. Ce n'est que lorsque vous copiez à partir d'une entité déconnectée que vous êtes seul. –

+0

@Craig: J'ai chargé le contexte à l'origine, mais j'ai constaté que mes modifications n'étaient pas appliquées à l'appel de SaveChanges(). Quel suivi des modifications un objet POCO doit-il effectuer? Et s'il doit implémenter un mécanisme de suivi des modifications, est-ce encore un objet POCO? –

Questions connexes