2009-12-23 1 views
0

J'ai un objet qui a de nombreuses assocations à d'autres objets. Tout cela est récupéré par nHibernate, ce qui est bon dans presque tous les cas.Comment définir le Fetchmode sur toutes les assocations d'un ICriteria nHibernate en une seule fois?

Dans un scénario particulier, dans ce cas une exportation d'un grand nombre d'enregistrements, je veux définir le Fetchmode sur toutes les associations. Est-il possible de le faire, sans avoir à spécifier manuellement chacun:

ICriteria crit = CreateCriteria(). 
    .SetFetchMode("Address", FetchMode.Eager) 
    .SetFetchMode("ContactPerson", FetchMode.Eager); 

La méthode que je voudrais trouver, mais n'ont pas été en mesure de:

// This doesn't work. 
ICriteria crit = CreateCriteria().SetFetchMode(FetchMode.Eager); 

Répondre

1

Non, il n'y pas moyen de le faire à la manière d'une couverture.

+0

C'est ma peur ... J'espère que quelqu'un me prouve mal. –

+0

Hélas ... c'est la vérité. J'ai utilisé une approche différente en récupérant les enregistrements un par un et en les ajoutant à l'export, en diffusant la session entre les deux. Maintenant, le serveur ne manque plus de mémoire. C'est au moins la solution rapide que nous avons mise en œuvre pour obtenir la sortie: P –

2

Vous pouvez essayer d'utiliser les métadonnées NHibernate.

ISessionFactory sessionFactory; 

Type type = typeof(MyEntity); 
IClassMetadata meta = sessionFactory.GetClassMetadata(type); 
foreach (string mappedPropertyName in meta.PropertyNames) 
{ 
    IType propertyType = meta.GetPropertyType(mappedPropertyName); 
    if (propertyType.IsAssociationType) 
    { 
     // initialize property 
     // recursively go through the properties of the associated entity 
    } 

    if (propertyType.IsCollectionType) 
    { 
     // initialize collection 
     // if it is a collection of entities, 
     // recursively go through the properties of the associated entity 

     // Use NHibernateUtil.Initialize 
    } 
} 

Je ne sais pas si cela en vaut la peine.

+0

Merci. J'effectue l'opération à un niveau où je n'ai pas accès à la sessionfactory, donc je doute que cette approche me fasse du bien. Mais je vais regarder dans MetaData! –

+0

Vous pouvez implémenter tout ce truc là où vous connaissez la fabrique de sessions et le fournir par une interface à l'autre partie. –

Questions connexes