2010-10-19 4 views
1

J'ai un type Type1 avec un Type2s de propriété composée d'un List<Type2>. J'ai configuré le mappage NHibernate pour la propriété comme suit:critères NHibernate fetchmode

[Map(0, Table = "Type2s", Schema = "MySchema", Cascade = CascadeStyle.All, Lazy = true, Inverse = true)] 
[Key(1, Column = "Type1Id")] 
[OneToMany(2, Class = "Type2, MyNamespace")] 

Quelle est la différence de comportement entre ces deux critères pour la récupération des cas Type1:

var criteria1 = DetachedCriteria.For<MyType1>(); 

var criteria2 = DetachedCriteria.For<MyType1>().SetFetchMode("Type2s", FetchMode.Join); 

Quand j'invoque .list sur l'exécutable critères de ces critères, probablement le SQL pour récupérer le Type2s associé à chaque instance Type1 n'est pas exécuté jusqu'à ce que je tente réellement d'accéder à la propriété parce que la propriété est marquée comme Lazy. est-ce une supposition correcte?

Si je veux forcer l'évaluation de la propriété Lazy comment cela peut-il mieux être atteint?

Répondre

1

Je ne suis pas très familier avec l'attribut de liaison par rapport à HBM/courant, mais je crois que vous avez résolu votre problème!

Vous avez raison en supposant que les données du Type2s ne seront pas chargés jusqu'à la demande en raison du sac étant paresseux. Le fetchmode de votre second critère force les objets à s'hydrater en même temps, ie. dans une base de données aller-retour.

En aparté, FetchMode.JOIN équivaut à FetchMode.Eager (ce qui est un meilleur nom re: la paresse, à mon avis).

article expliquant un peu plus en profondeur: http://davidhayden.com/blog/dave/archive/2008/12/06/ImprovingNHibernatePerformanceFetchingStrategiesFetchModeFluentNHibernate.aspx

décrivant FetchMode.Join et FetchMode.Eager: http://bchavez.bitarmory.com/archive/2008/04/04/differences-between-nhibernate-fetchmode.eager-and-fetchmode.join.aspx

+0

explication Excellent, merci. – Ben

Questions connexes