2010-06-13 3 views
6

J'ai une hiérarchie d'objets assez profonde que j'essaie de conserver avec Entity Framework 4, POCO, PI (persistance ignorance) et Code First. Soudain, les choses ont commencé à bien fonctionner quand j'ai commencé à ne plus utiliser l'opérateur new(). À l'origine, les objets utilisent souvent new() pour créer des objets enfants. Au lieu de cela, j'utilise ma position sur le Repository Pattern pour créer tous les objets enfants si nécessaire. Par exemple, étant donné:Entity Framework 4 Code First et new() Opérateur

class Adam 
{ 
    List<Child> children; 
    void AddChildGivenInput(string input) { children.Add(new Child(...)); } 
} 

class Child 
{ 
    List<GrandChild> grandchildren; 
    void AddGrandChildGivenInput(string input) { grandchildren.Add(new GrandChild(...)); } 
} 

class GrandChild 
{ 
} 

("GivenInput" implique un certain traitement non représentés ici)

Je définis un AdamRepository comme:

class AdamRepository 
{ 
    Adam Add() 
    { 
     return objectContext.Create<Adam>(); 
    } 
    Child AddChildGivenInput(Adam adam, string input) 
    { 
     return adam.children.Add(new Child(...)); 
    } 
    GrandChild AddGrandchildGivenInput(Child child, string input) 
    { 
     return child.grandchildren.Add(new GrandChild(...)); 
    } 
} 

Maintenant, cela fonctionne assez bien. Cependant, je ne suis plus "ignorant" de mon mécanisme de persistance car j'ai abandonné l'opérateur new().

En outre, je risque d'avoir un anemic domain model car une telle logique se retrouve dans le référentiel plutôt que dans les objets du domaine.

Après beaucoup adieu, une question:

Ou plutôt plusieurs questions ...

  • Est-ce modèle doivent travailler avec le code EF 4 Première?
  • Existe-t-il un moyen de conserver l'utilisation de new() et de travailler avec EF 4/POCO/Code First?
  • Existe-t-il un autre modèle qui laisserait la logique dans l'objet domaine et fonctionnerait toujours avec EF 4/POCO/Code First?
  • Cette restriction sera-t-elle levée dans les versions ultérieures du support Code First?

Parfois, en essayant de suivre la voie de l'ignorance persistance POCO/ se sent comme nage en amont, d'autres fois il se sent comme nager jusqu'à Niagra Falls. Pourtant, je veux croire ...

Répondre

4

Voici quelques points qui pourraient aider à répondre à votre question:

Dans vos classes que vous avez un champ pour la collection enfants et une méthode pour ajouter aux enfants . EF en général (pas seulement Code First) requiert actuellement que les collections soient des surfaces en tant que propriétés, donc ce modèle n'est pas actuellement supporté. Une plus grande flexibilité dans la façon dont nous interagissons avec les classes est une demande courante pour EF et notre équipe regarde comment nous pouvons supporter cela en ce moment

Vous avez mentionné que vous devez explicitement enregistrer des entités avec le contexte, ce n'est pas nécessairement l'affaire. Dans l'exemple suivant, si GetAdam() renvoie un objet Adam attaché au contexte sous-jacent, alors le nouvel enfant Cain sera automatiquement découvert par EF lors de l'enregistrement et de l'insertion dans la base de données.

var adam = myAdamRepository.GetAdam();

var cain = new Enfant();

adam.Enfants.Ajouter (cain);

~ Rowan

+0

Bienvenue dans Stack Overflow. Le problème fondamental est que j'ai vraiment une hiérarchie d'objets profonds, où chaque niveau sait comment créer des instances d'objets du niveau suivant. Ma compréhension et expérience est que je devrais marcher manuellement ma hiérarchie d'objet pour attacher tous les objets individuellement à un ObjectContext avant qu'ils puissent être persistés. Mon application est assez complexe mais je vais essayer de la distiller jusqu'à un exemple simple et complet. Cela n'arrivera pas aujourd'hui, espérons-le demain. –

+1

@Eric J, ce n'est pas ce que j'ai compris par la réponse de Rowan. Pour moi, cela ressemble à "Si vous ajoutez quelque chose à la collection publique d'objets liés, alors EF stockera automatiquement cette entité même si vous ne l'avez pas explicitement ajouté à ObjectContext". Ceci est cohérent avec le comportement de LINQ to SQL. –