J'ai une liste de documents dans ma base de données. Chaque document a une collection d'éléments enfants. Maintenant, mon scénario est que: - lire les documents (uniquement à partir de la table de documents) - Fermer la session et laisser l'utilisateur faire du travail. P>
Mais quand je le fais, le document essaie de charger des éléments d'enfant à certains endroits. Je ne le veux pas. Je veux lire explicitement les éléments de l'enfant. Pour la première partie, j'ai besoin de lire simplement des valeurs de document simples. p>
Y a-t-il un moyen de dire à NHibernate - "Hé, ne jamais lire cette collection!"? P>
3 Réponses :
Définissez le chargement paresseux de votre collection sur Il est préférable de le définir sur avec qui lira une rangée de la table postale et de la ligne de la table des commentaires de la base de données, même si vous n'avez pas accédé aux commentaires de la collection d'enfants de la poste de votre application. en utilisant en utilisant paresseux fort>: p> qui chargera les commentaires de la publication à partir de la base de données: p> paresseux code> ou
extra code>, peut-être est défini sur
nolazy code> (aka chargement désireux).
Extra code> au lieu de
paresseux code> seulement. Comme il empêchera NHibernate de récupérer les lignes de la collection enfant lorsque vous ne voulez que recevoir le
.Count () code> ou
. Nan () code> de la collection enfant.
Extra Code> est comme une version plus paresseuse de paresseuse :) p>
paresseux code>,
var post = session.get
comme pour le paresseux vs Extra h3>
select count(*) from comments where post_id = 1
Je l'ai déjà défini sur paresseux. Je ne veux pas avoir ces archives du tout. Je ne veux même pas obtenir le compte de la base de données, car la session n'existe plus. C'est pourquoi je ne veux pas avoir ces archives.
En tant que solution temporaire, j'ai créé un piratage simple: et voici comment je reçois les documents: p> db.BeginTransaction();
IList<Document> list = db.Get<Document>();
db.CommitTransaction();
List<Document> result = new List<Document>();
foreach (var item in list)
{
item.ResetPeriods(); //todo: HACK! Preventing from lazy load of periods
result.Add(item);
}
return result;
Hmm .. c'est dangereux. Il est possible que cela puisse supprimer la période de collecte des enfants de la table. Peut-être même si vous définissez la stratégie de chargement de la collection enfant de la collection enfant sur
paresseux code> (ou
extra code>), et non
nonZYZY code>, Vous avez défini la stratégie
FETCH code> de la collection enfant sur code> Joindre code>? Par conséquent, la période de collecte des enfants a été récupérée même si cela n'est pas consulté. Voir ma nouvelle réponse.
Cela ne le supprimera pas parce que c'est hors transaction. Mais toujours, est un hack. Je ne veux tout simplement pas lire les périodes à moins que je lui dise. Ceci est comme deux commandes différentes. L'un est: lire tous les documents. Seulement des documents. Et l'autre commande est: obtenir des périodes pour ce document. Mais entre les deux, je peux avoir des lectures sur la collecte des périodes et je ne veux pas que cela soit lu.
J'ai trouvé ce qui entraîne la chargement des périodes du document à partir de la base de données, même si vous n'accédez pas à la propriété des périodes du document.
SQL produced: NHibernate: SELECT document0_.Id as id1_0_0_, document0_.DocumentDescription as documentdescription2_0_0_ FROM Document document0_ WHERE document0_.Id=@p0; @p0 = 1 [Type: Int32 (0:0:0)]
Ce n'est pas ma question. Je ne veux pas que NHibernate ait jamais lu cette collection à partir de la base de données. À moins que je lui dise explicitement: «Maintenant, obtenez cette collection de la base de données».