Pourquoi ne entity framework besoin d'un ICollection pour le chargement paresseux?
Je veux écrire un domaine riche en classe comme
public class Product
{
public IEnumerable<Photo> Photos {get; private set;}
public void AddPhoto(){...}
public void RemovePhoto(){...}
}
Mais le cadre de l'entité (V4 première approche de code) nécessite une ICollection type de chargement paresseux! Le code ci-dessus ne fonctionne plus comme prévu puisque les clients peuvent contourner l'AddPhoto /RemovePhoto méthode d'appeler directement la méthode add sur ICollection. Ce n'est pas bon.
public class Product
{
public ICollection<Photo> Photos {get; private set;} //Bad
public void AddPhoto(){...}
public void RemovePhoto(){...}
}
C'est vraiment frustrant d'essayer de mettre en œuvre DDD avec le EF4. Pourquoi ont-ils choisi la ICollection pour le chargement paresseux?
Comment puis-je surmonter cela? Ne NHibernate m'offrir une meilleure DDD expérience?
- Essayer de comprendre moi-même. Je sais que le chemin à parcourir est comme vous l'avez décrit. Mais comment ? Il est également possible en EF 4.1 maintenant ? ou avez-vous trouvé une solution ?
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai trouvé la solution...Voir ici pour plus de détails: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/47296641-0426-49c2-b048-bf890c6d6af2/
Essentiellement, vous voulez faire de la ICollection type protégé et ce que la sauvegarde de la collecte pour le public IEnumerable
Pour le chargement paresseux pour travailler le type doit mettre en œuvre ICollection et l'accès doit être public ou protégé.
Vous ne pouvez pas insérer dans un IEnumerable. Cela s'applique à l'EF, tout autant que pour vos clients. Vous n'avez pas à utiliser ICollection, cependant; vous pouvez utiliser IList ou d'autres droits en écriture types. Mes conseils pour obtenir le meilleur des deux mondes est d'exposer les Dto plutôt que des entités à vos clients.
e
dans cet exemple. Le point important ici est qu'un objet de typeEmployee
était même jamais matérialisé dans cette requête. L'entité, dans ce contexte, sert uniquement pour la cartographie dans votre requête LINQ, pas de réelle de l'instanciation.Vous pouvez résoudre ce problème en utilisant la ReadOnlyCollection(T)
EDIT:
ICollection<T>
=>IList<T>
Espère que c'est ce que vous cherchez.