2010-10-15 34 views
0

Je suis assez nouveau pour nhibernate, donc cela peut être assez simple, mais je n'ai pas encore trouvé de réponse sur le web.Renvoie uniquement le parent utilisant nHibernate

Disons que j'ai une classe Parent et une classe enfant. La classe parent peut avoir plusieurs classes enfants associées. Maintenant, quand j'essaye de charger un nhibernate Parent spécifique, il remplit aussi sa collection Child pour moi. Il y a des situations où je veux juste renvoyer une classe parent sans une collection d'enfant.

Je sais que je peux activer le chargement paresseux, mais cela ne fonctionnera pas comme im sérialiser le parent au format XML. Le sérialiseur XML ne peut pas fonctionner avec nhibernate PersistanceBag qui contient la collection enfant.

Y a-t-il un moyen de définir une classe Parent, disons ParentView qui fonctionne sur la même table mais ne contient que les propriétés Parent et pas tous ses enfants et petits-enfants?

Répondre

3

Définissez une classe ParentView qui contient les colonnes que vous devez extraire. Assurez-vous que cette classe a un constructeur sans paramètre.

ISession session = NHibernateHelper.Session; 
ISQLQuery query = session.CreateSQLQuery("select Parent_ID, Name form Parent where Parent_ID = :parentID"); 
query.SetInt32("parentID", parentID); 
IList<ParentView> parentView = query.SetResultTransformer(Transformers.AliasToBean<ParentView>()).List<ParentView>(); 
return parentView; 
+0

Cela semble intéressant, Im utilisant fluentnhibernate et im assez nouveau à nhibernate en général. Existe-t-il un moyen d'obtenir le même résultat en utilisant couramment? – SecretDeveloper

+1

NHibernate fluide est l'aide à la cartographie. Cette solution présentée ci-dessus est une requête et ne tombe pas dans le cadre de Fluent NHibernate. –

+0

Yup cela a fonctionné un régal. Merci. – SecretDeveloper

0

Une alternative à la création d'une classe d'affichage et requête associée comme suggéré par sh_kamalh (que je considère si je vous). Si le problème est lié à la structure de la cartographie de sac que vous pourriez spécifiquement alors deux solutions plus simples:

Option 1

Revisiter la mise en correspondance de sac - Peut-être simple, la sélection d'une stratégie différente va résoudre le problème. J'ai déjà répondu à une question sur les différents mappings de collection avant le List vs Set vs Bag in NHibernate personnellement je trouve que j'utilise beaucoup la stratégie Set. Pour mapper une stratégie différente dans Fluent NHibernate, utilisez ce qui suit comme guide dans votre override.

mapping.HasMany<Child>(x => x.Children).ToSet(); 

ou

mapping.HasMany<Child>(x => x.Children).ToList(); 

Option 2

Pas particulièrement liée à NHibernate mais si vous utilisez le sérialiseur XML par défaut, vous pourriez être en mesure de dire au sérialiseur XML pour ignorer simplement que propriété et laisser la cartographie du sac en place.

[System.Xml.Serialization.XmlIgnore] 
public IEnumerable<Child> Children { get; internal set; }