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 ...
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. –
@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. –