我正在使用ASP.NET MVC + NHibernate + Fluent NHibernate并且在延迟加载方面存在问题。
通过这个问题( How to fix a NHibernate lazy loading error "no session or session was closed"? ),我发现我必须在View模式中实现Open Session,但我不知道如何。
在我的存储库类中,我使用像这样的方法
public ImageGallery GetById(int id) {
using(ISession session = NHibernateSessionFactory.OpenSession()) {
return session.Get<ImageGallery>(id);
}
}
public void Add(ImageGallery imageGallery) {
using(ISession session = NHibernateSessionFactory.OpenSession()) {
using(ITransaction transaction = session.BeginTransaction()) {
session.Save(imageGallery);
transaction.Commit();
}
}
}
这是我的Session Factory助手类:
public class NHibernateSessionFactory {
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory {
get {
if(_sessionFactory == null) {
_sessionFactory = Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString(MyConnString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ImageGalleryMap>())
.ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none"))
.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession() {
return SessionFactory.OpenSession();
}
}
有人可以帮我在View模式中实现Open Session吗?
谢谢。
答案 0 :(得分:2)
之前已经问过,但我不记得在哪里找到它。当您执行以下操作或类似操作时,您拥有所需的内容,并且某些代码重复会在您的存储库中减少为奖励。
public class Repository
{
private readonly ISession session;
public Repository()
{
session = CurrentSessionContext.CurrentSession();
}
public ImageGallery GetById(int id)
{
return session.Get<ImageGallery>(id);
}
public void Add(ImageGallery imageGallery)
{
session.Save(imageGallery);
}
}
您还可以使用ioc容器和工作包装单元而不是当前会话上下文来管理会话。