Существует несколько различных способов справиться с этим в веб-приложении, и , вероятно, , наиболее распространенным в веб-приложениях является сеанс на веб-запрос.
Внутри Application_Start
в global.asax.cs
создайте SessionFactory и назначьте его статическому свойству:
public static ISessionFactory SessionFactory { get; private set; }
protected void Application_Start(object sender, EventArgs e)
{
// your configuration setup
var configuration = new NHibernate.Cfg.Configuration().Configure();
SessionFactory = configuration.BuildSessionFactory();
}
Затем в Application_BeginRequest
в global.asax.cs
откройте сеанс с помощью SessionFactory и привяжите его к CurrentSessionContext
protected void Application_BeginRequest(object sender, EventArgs e)
{
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
и Application_EndRequest
в global.asax.cs
, отсоедините сеанс и избавьтесь от него
protected void Application_EndRequest(object sender, EventArgs e)
{
var session = CurrentSessionContext.Unbind(SessionFactory);
session.Dispose();
}
Теперь внутри приложения, когда требуется сеанс, мы просто запрашиваем SessionFactory
текущий сеанс
public class HomeController : Controller
{
public ActionResult Index()
{
IEnumerable<Product> products = null;
var session = MvcApplication.SessionFactory.GetCurrentSession();
using (var transaction = session.BeginTransaction())
{
// your query, which sounds like it should also eager load
// a child collection
products = session.QueryOver<Product>().List();
transaction.Commit();
}
return View(products);
}
}
Существует множество вариантов, включая использование LazySessionContext
для ленивого создания сеанса, только если он необходим для запроса, и реализации, где ISessionFactory
может быть введено в ваши контроллеры через зависимость инъекции.