J'introduit un mappage pour un objet métier qui a (entre autres) une propriété appelée « Nom »:NHibernate chargement non intentionnelle de la propriété paresseux
public class Foo : BusinessObjectBase
{
...
public virtual string Name { get; set; }
}
Pour une raison quelconque, quand je vais chercher des objets « Foo », NHibernate semble appliquer le chargement de la propriété paresseux (pour les propriétés simples et non des associations):
le morceau de code suivant génère n + 1 instructions SQL, dont le premier ne récupèrera que les ids, et le reste n chercher la Nom pour chaque enregistrement:
ISession session = ...IQuery query = session.CreateQuery(queryString);
ITransaction tx = session.BeginTransaction();
List<Foo> result = new List<Foo>();
foreach (Foo foo in query.Enumerable())
{
result.Add(foo);
}
tx.Commit();
session.Close();
produit:
select foo0_.FOO_ID as col_0_0_ from V1_FOO foo0_
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 81
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 36470
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 36473
De même, le code suivant conduit à une LazyLoadingException après session est fermée:
ISession session = ...
ITransaction tx = session.BeginTransaction();
Foo result = session.Load<Foo>(id);
tx.Commit();
session.Close();
Console.WriteLine(result.Name);
Après this post, « propriétés paresseux. .. est rarement une fonctionnalité importante pour activer ... (et) dans Hibernate 3, est désactivé par défaut. "
Alors qu'est-ce que je fais mal? J'ai réussi à contourner l'exception LazyLoadingException en faisant un NHibernateUtil.Initialize(foo)
mais la pire partie sont les instructions n + 1 sql qui mettent mon application à genoux.
Voici comment le mapping ressemble à:
<class name="Foo" table="V1_FOO">
...
<property name="Name" column="NAME"/>
</class>
BTW: La classe de base abstraite "BusinessObjectBase" encapsule la propriété ID qui sert l'identifiant interne.
quelle version de NHibernate utilisez-vous? – Jaguar
2.1.2.4000; hmm thats <3. Devinez propriétés paresseux ne sont même pas encore pris en charge dans cette version? Quoi qu'il en soit, comme Stefan a souligné que le problème n'est pas dû à la charge de propriété paresseuse. – chiccodoro
mis à jour ma réponse avec des exemples de code et d'autres suggestions. –