2011-10-06 5 views
3

J'utilise NHibernate et j'ai 3 classes cartographiées - A, B, C. Classe A semble que les éléments suivants:NHibernate: propriétés de type projection et référence

public class A 
{ 
public virtual string StringProp1 { get; set; } 
public virtual string StringProp2 { get; set; } 
public virtual B BProp { get; set; } 
public virtual C CProp { get; set; } 
} 

Tout fonctionne très bien, mais ce que je voudrais faire est une certaine optimisation. Mon but est d'avoir une possibilité de spécifier dynamiquement quelles propriétés doivent être chargées (à partir de DB). Donc je ne peux pas simplement marquer certaines propriétés comme paresseuses dans le mapping. La façon dont je pense que cela devrait fonctionner est le suivant:

ICriteria criteria = session.CreateCriteria<A>(); 
criteria.SetProjection(Projections.ProjectionList() 
.Add(Projections.Property("StringProp1"), "StringProp1") 
.Add(Projections.Property("BProp"), "BProp")); 
criteria.SetResultTransformer(Transformers.AliasToBean<A>()); 
return criteria.List<A>(); 

Mais cela ne fonctionne pas pour propriété type de référence (comme Bprop), même si je vais ajouter un alias aux critères. Je reçois l'exception "Index était en dehors des limites du tableau" sur la dernière ligne.

Si je supprime une ligne qui ajoute une projection de BProp, cela fonctionne et me renvoie l'instance de la classe A où seulement StrinProp1 est rempli avec la valeur. Mais je veux aussi avoir l'instance correspondante de la classe B chargée dans BProp.

Des suggestions?

Répondre

0

Cela ne ressemble pas à la bonne façon de faire les choses. Si vous essayez de Bprop désireux de charge, vous devez faire quelque chose comme:

criteria.SetFetchMode("BProp", SetFetchMode.Eager); 
+0

Je voudrais charger des propriétés Bprop et StringProp1, mais pas CProp et StringProp2 (afin de rendre résultat instruction SQL simple et plus rapide). Je ne pense pas que FetchMode est ce que je cherche. – mayor

Questions connexes