gpt4 book ai didi

asp.net-mvc - 如何修复NHibernate延迟加载错误 "no session or session was closed"?

转载 作者:行者123 更新时间:2023-12-02 07:34:45 24 4
gpt4 key购买 nike

我正在使用 ASP.NET MVC、NHibernate 和 Fluent Hibernate 开发一个网站,当我尝试访问子对象时收到错误“没有 session 或 session 已关闭”。

这些是我的域类:

public class ImageGallery {
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual IList<Image> Images { get; set; }
}

public class Image {
public virtual int Id { get; set; }
public virtual ImageGallery ImageGallery { get; set; }
public virtual string File { get; set; }
}

这些是我的 map :

public class ImageGalleryMap:ClassMap<ImageGallery> {
public ImageGalleryMap() {
Id(x => x.Id);
Map(x => x.Title);
HasMany(x => x.Images);
}
}

public class ImageMap:ClassMap<Image> {
public ImageMap() {
Id(x => x.Id);
References(x => x.ImageGallery);
Map(x => x.File);
}
}

这是我的 session 工厂辅助类:

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();
}
}

当我使用以下代码从数据库获取 ImageGallery 时,一切正常:

IImageGalleryRepository igr = new ImageGalleryRepository();
ImageGallery ig = igr.GetById(1);

但是,当我尝试使用此代码访问 Image 子对象时

string imageFile = ig.Images[1].File;

我收到此错误:

初始化[Entities.ImageGallery#1] - 未能延迟初始化角色集合:Entities.ImageGallery.Images,没有 session 或 session 被关闭

有人知道如何解决这个问题吗?

非常感谢!

编辑

我的 GetById 方法是:

    public ImageGallery GetById(int id) {
using(ISession session = NHibernateSessionFactory.OpenSession()) {
return session.Get<ImageGallery>(id);
}
}

最佳答案

据推测,您的 GetById 正在关闭 session 。这可以是明确的,或者通过 using 语句。

更好的 session 管理方法是在 View 中打开 session 模式。 NHibernate session 的创建成本很低,因此在每个请求开始时创建一个 session ,并在结束时关闭它。

// in global.asax.cs

public void Application_Start()
{
BeginRequest += delegate {
CurrentSessionContext.Bind( sessionFactory.OpenSession());
};

EndRequest += delegate {
var session = sessionFactory.GetCurrentSession();
if (null != session) {
session.Dispose();
}
CurrentSessionContext.Unbind(sessionFactory);
};
}

// in your NHibernateSessionFactory class
public static ISession OpenSession() {
return SessionFactory.GetCurrentSession();
}

使用 DI 容器,我们可以将 session 注入(inject)每个请求范围内的实例。

// ninject example
Bind<ISession>()
.ToMethod( ctx => sessionFactory.GetCurrentSession() )
.InRequestScope();

关于asp.net-mvc - 如何修复NHibernate延迟加载错误 "no session or session was closed"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com