essayer d'implémenter une session par requête Web, Pas de configuration du contexte de session en cours
-
12-12-2019 - |
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);
}
}
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.