0
votes

Comment bloquer NHibernate de lire la collection enfant?

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.

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.

Y a-t-il un moyen de dire à NHibernate - "Hé, ne jamais lire cette collection!"?


0 commentaires

3 Réponses :


1
votes

Définissez le chargement paresseux de votre collection sur paresseux code> ou extra code>, peut-être est défini sur nolazy code> (aka chargement désireux).

Il est préférable de le définir sur 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>

avec NOLEZY STRAND> / EDER-Loading Fort>: P> xxx pré>

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 paresseux code>, var post = session.get (1) code> ne chargera que la rangée de la table des poteaux, NHibernate ne lit pas le Post's Child Collection Comments de la base de données. P>

comme pour le paresseux vs Extra h3>

en utilisant paresseux fort>: p> xxx pré>

qui chargera les commentaires de la publication à partir de la base de données: p>

select count(*) from comments where post_id = 1


1 commentaires

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.



0
votes

En tant que solution temporaire, j'ai créé un piratage simple: xxx pré>

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;


2 commentaires

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 (ou extra ), et non nonZYZY , Vous avez défini la stratégie FETCH de la collection enfant sur Joindre ? 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.



0
votes

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)]


1 commentaires

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».