从ASP.Net中的web用户控件调用NHibernate时崩溃
我有一个非常奇怪的问题:从web用户控件调用NHibernate时崩溃 我正在开发一个ASP.Net(2.0)网页,它使用NHibernate访问数据库 我有一个简单的工厂类来访问ProjectInfo表中的CurrentStepNumber列:从ASP.Net中的web用户控件调用NHibernate时崩溃,asp.net,nhibernate,controls,Asp.net,Nhibernate,Controls,我有一个非常奇怪的问题:从web用户控件调用NHibernate时崩溃 我正在开发一个ASP.Net(2.0)网页,它使用NHibernate访问数据库 我有一个简单的工厂类来访问ProjectInfo表中的CurrentStepNumber列: public class ProjectEntity { private int? _currentStepNumber; public virtual int? CurrentStepNumber { get
public class ProjectEntity
{
private int? _currentStepNumber;
public virtual int? CurrentStepNumber
{
get { return _currentStepNumber; }
set { _currentStepNumber = value; }
}
public static ProjectWizardEntity GetById(int id, bool shouldLock)
{
return RepositoryFactory.ProjectWizardRepository.GetById(id, shouldLock);
}
public static ProjectWizardEntity GetById(int id)
{
return GetById(id, false);
}
public virtual void Save()
{
RepositoryFactory.ProjectWizardRepository.Save(this);
}
public virtual void SaveOrUpdate()
{
RepositoryFactory.ProjectWizardRepository.SaveOrUpdate(this);
}
}
此类通过代理类访问,因此每次分配新值时,都会将其刷新到数据库:
public class DBHelper
{
ProjectEntity _projectEntity;
ProjectEntity GetProjectEntity()
{
if (_projectEntity == null)
_projectEntity = //get or create a new one;
return _projectEntity ;
}
public int? CurrentStepNumber
{
get
{
return (CurrentProjectId > 0) ? CurrentProjectWizardEntity.CurrentStepNumber : 0;
}
set
{
if (CurrentProjectId > 0)
{
CurrentProjectWizardEntity.CurrentStepNumber = value;
CurrentProjectWizardEntity.SaveOrUpdate();
}
}
}
}
现在的问题是:
我想不出这里有什么问题,所以如果您能提供任何帮助,我们将不胜感激。我想您在这里遇到了会话管理问题。RepositoryFactory.ProjectWizardRepository.GetById如何创建并可能处理NHibernate会话?它是否创建并关闭会话 似乎DBHelper.GetProjectEntity()正在创建或加载一个ProjectEntity。稍后,当我调用CurrentStepNumber的setter时,您将对象插入或更新到数据库中 问题是,当DBHelper.GetProjectEntity()加载现有对象并在加载后关闭会话但保留该对象时,我们正在进入深水区。稍后更新对象时,为CurrentStepNumber设置一个新值,并将对象发送到NHibernate保存。这里的问题是,对象与保存期间创建和关闭的新会话没有关联。然后,Nhibernate会感到困惑,因为发现了一个新对象,该对象不是从当前会话加载的,但它有一个现有对象的id
对于解决方案,请在Google上搜索“NHibernate asp.net会话管理”,您将获得许多关于如何使用asp.net请求周期作为工作单元的好消息。您是否有一些回发测试,以便不会两次加载对象?