NHibernate -l'échec de l'paresseusement initialiser une collection de rôle
J'ai le texte suivant, en apparence simple, le scénario, mais je suis encore assez nouveau pour NHibernate.
Quand vous essayez de charger le modèle suivant pour une action Edit sur mon Contrôleur:
Du contrôleur de Modifier l'Action:
public ActionResult Edit(Guid id)
{
return View(_repository.GetById(id));
}
Référentiel:
public SomeModel GetById(Guid id)
{
using (ISession session = NHibernateSessionManager.Instance.GetSession())
return session.Get<SomeModel >(id);
}
Modèle:
public class SomeModel
{
public virtual string Content { get; set; }
public virtual IList<SomeOtherModel> SomeOtherModel { get; set; }
}
J'obtiens l'erreur suivante:
-l'échec de l'paresseusement initialiser une collection de rôle: SomeOtherModel, pas de session ou la session a été fermée
Ce qui me manque ici?
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous créez et aussi fermer la session en vous les modèles
GetById
méthode. (à l'aide de la déclaration de la fermeture de la session) La session doit être disponible pendant toute la durée de l'opération commerciale.Il y a plusieurs moyens d'y parvenir. Vous pouvez configurer NHibernate pour utiliser la session d'usines GetCurrentSession méthode. Voir ce sur nhibernate.info ou ce post sur le Code du Projet.
Je n'utilise pas cette. J'ai écrit mon propre service de transaction qui permet à l'suivantes:
Cependant vous mettre en œuvre, des séances et des transactions doit vivre aussi longtemps que l'opération de vente (ou de la fonction du système). À moins que vous ne pouvez pas compter sur l'isolation de la transaction, ni restauration de l'ensemble de la chose.
Vous devez avec impatience la charge de la
SomeOtherModel
collection si vous avez l'intention de l'utiliser avant la clôture de la session:Par défaut FluentNHibernate utilise le chargement différé pour la collection de mappages. Une autre option est de modifier ce comportement par défaut dans votre cartographie:
Noter que si vous faites ce
SomeOtherModel
sera chargé avec impatience (à l'aide d'une jointure externe) chaque fois que vous chargez l'entité mère qui pourrait ne pas être ce que vous voulez. En général je préfère toujours laisser la valeur par défaut de chargement différé à la cartographie de niveau et de régler mes requêtes en fonction de la situation.Référence: http://nhibernate.info/doc/howto/various/lazy-loading-eager-loading.html