Question

Comme je l'ai dit dans le titre, je souhaite implémenter une session par requête Web.Mon fournisseur de session est configuré comme ceci (je ne suis pas intéressé à changer cette conf.)

    public class SessionProvider
    {
        public static SessionProvider Instance { get; private set; }
        private static ISessionFactory _SessionFactory;

        static SessionProvider()
        {
            var provider = new SessionProvider();
            provider.Initialize();
            Instance = provider;
        }

        private SessionProvider()
        {

        }

        private void Initialize()
        {
            string csStringName = "ConnectionString";
            var cfg = Fluently.Configure()
                ....ommiting mappings and db conf.
                .ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
                .BuildConfiguration();
            _SessionFactory = cfg.BuildSessionFactory();    
        }

        public ISession OpenSession()
        {
            return _SessionFactory.OpenSession();
        }

        public ISession GetCurrentSession()
        {
            return _SessionFactory.GetCurrentSession();
        }
    }

À l'intérieur de Global.axx.cs J'ai le code suivant lié à la session par requête Web.

private static ISessionFactory SessionFactory { get; set; }

    protected void Application_Start()
    {
        SessionFactory = MyDomain.SessionProvider.Instance.OpenSession().SessionFactory;

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var session = SessionFactory.OpenSession();
        CurrentSessionContext.Bind(session);
    }

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        var session = CurrentSessionContext.Unbind(SessionFactory);
        session.Dispose();
    }

Lors du débogage de ma webapp, j'obtiens une erreur: Aucun contexte de session en cours configuré. Message d'erreur référencé à global.uncourant de lignecourantsessioncontexte.Lier (session);

Mise à Jour Ajouté .ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web")) et maintenant, j'ai un message d'erreur sur la récupération des données de mon contrôleur comme celui-ci Message d'erreur: La session est close!Nom de l'objet:"ISession".

Code du contrôleur:

using (ISession session = SessionProvider.Instance.GetCurrentSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    data = session.QueryOver<Object>()
                       ...ommiting

                    transaction.Commit();
                    return PartialView("_Partial", data);
                }

            }    
Était-ce utile?

La solution

1ère Question

Vous devez le configurer dans votre section de configuration nhibernate:

<property name="current_session_context_class">web</property>

Aussi je fais actuellement quelque chose comme ça:

if (!CurrentSessionContext.HasBind(SessionFactory))
{
    CurrentSessionContext.Bind(SessionFactory.OpenSession());
}

2ème Question

Veuillez consulter l'article suivant pour modifier la configuration couramment: currentsessioncontext couramment nhibernate comment faire?

3ème Question

Vous fermez votre session deux fois.

using (ISession session = SessionProvider.Instance.GetCurrentSession()) 

ferme votre session.Puis tu l'as fait à nouveau dans Application_EndRequest.Si vous avez une autre question, veuillez poster une nouvelle question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top