Je viens de commencer à utiliser NHibernate, et j'ai quelques problèmes que je ne sais pas comment résoudre correctement.Sessions NHibernate - quelle est la manière courante de gérer les sessions dans les applications Windows?
J'ai commencé par créer un référentiel générique contenant CUD et quelques méthodes de recherche. Chacune de ces méthodes ouvre une session distincte (et une transaction si nécessaire) pendant les opérations de la base de données. Le problème lorsque je fais cela (pour autant que je sache) est que je ne peux pas tirer parti du chargement paresseux des collections/objets associés. Dans le mappage fluide, presque toutes les relations d'entité ont .Not.LazyLoad()
, il en résulte que la base de données entière est chargée lorsque je demande une liste de toutes les entités d'un type donné.
-moi si je me trompe, parce que je suis encore un débutant complet quand il vient à NHibernate :)
Quelle est la plus courante de faire pour éviter cela? Avoir une session statique globale qui reste en vie tant que le programme s'exécute, ou que dois-je faire?
Une partie du code référentiel:
public T GetById(int id)
{
using (var session = NHibernateHelper.OpenSession())
{
return session.Get<T>(id);
}
}
Utilisation du référentiel pour obtenir une personne
var person = m_PersonRepository.GetById(1); // works fine
var contactInfo = person.ContactInfo; // Throws exception with message:
// failed to lazily initialize a collection, no session or session was closed
Merci pour votre réponse. J'ai lu le chapitre de la documentation, mais je ne comprends toujours pas ce que vous voulez dire dans la deuxième phrase. Voulez-vous dire que je dois maintenir la session si j'ai besoin d'accéder à des propriétés chargées paresseuses? Je vais ajouter une partie de mon code de dépôt à la question. – l3dx
Bien sûr - ajouter un peu de contexte à la question et je l'aborderai plus spécifiquement dans la réponse. –
Nice, merci beaucoup! +1 Je retravaillerai mon dépôt ensuite :) Je crois comprendre que les choses session/db devraient être "superposées" à partir de l'application, donc si je le supprime du dépôt, où le placerais-je? – l3dx