例えば。私のセッションファクトリはMyDomain.SessionProviderクラスにあります。セッションを開くことができますusing ISession session = SessionProvider.Instance.OpenSession()
ステップ:SessionProvider.cs
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 mapping 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();
}
ステップ:Global.asax.cs
public static ISessionFactory SessionFactory { get; private set; }
アプリケーション開始
SessionFactory = SessionProvider.Instance.OpenSession().SessionFactory;
App_BeginRequest
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
EndRequest破棄セッション
var session = CurrentSessionContext.Unbind(SessionFactory);
session.Dispose();
Step3.HomeController 次のような現在のセッションを使用する必要があります
var session = SessionProvider.Instance.GetCurrentSession();
using (var tran = session.BeginTransaction())
{
//retrieve data from session
}
さて、descのように私のコントローラーでデータを取得しようとしています。ステップ3で。セッションが閉じられたというエラーメッセージが表示されました。global.asax内のApplication_EndRequestブロックを削除しようとしましたが、トランザクションがセッションでラップされましたが、成功しませんでした。それでも同じエラー。
2番目/副次的な質問:このパターンは広く受け入れられていますか、それともmvcコントローラーのカスタム属性内にラップする方が良いですか?ありがとう。
更新:現在のセッションをインラインでインスタンス化しようとしたときにコントローラーで
var session = SessionProvider.Instance.GetCurrentSession();
次のエラーが発生します:
**Connection = 'session.Connection' threw an exception of type 'NHibernate.HibernateException'**
**base {System.ApplicationException} = {"Session is closed"}**