从ASP.Net中的web用户控件调用NHibernate时崩溃

从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

我有一个非常奇怪的问题:从web用户控件调用NHibernate时崩溃

我正在开发一个ASP.Net(2.0)网页,它使用NHibernate访问数据库

我有一个简单的工厂类来访问ProjectInfo表中的CurrentStepNumber列:

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();
        }
    }
}
}
现在的问题是:

  • 当我从test.aspx页面访问CurrentStepNumber时,一切正常
  • 当我从test.aspx页面上使用的web用户控件(test.ascx)中读取此字段时,它仍然正常
  • 但是当我尝试在控件后面的代码(test.ascx)中为CurrentStepNumber赋值时,总是会出现异常:
  • NHibernate.UnuniqueObjectException:具有相同标识符值的不同对象已与会话关联

    实际上,NHibernate存储库的SaveOrUpdate方法抛出异常


    我想不出这里有什么问题,所以如果您能提供任何帮助,我们将不胜感激。

    我想您在这里遇到了会话管理问题。RepositoryFactory.ProjectWizardRepository.GetById如何创建并可能处理NHibernate会话?它是否创建并关闭会话

    似乎DBHelper.GetProjectEntity()正在创建或加载一个ProjectEntity。稍后,当我调用CurrentStepNumber的setter时,您将对象插入或更新到数据库中

    问题是,当DBHelper.GetProjectEntity()加载现有对象并在加载后关闭会话但保留该对象时,我们正在进入深水区。稍后更新对象时,为CurrentStepNumber设置一个新值,并将对象发送到NHibernate保存。这里的问题是,对象与保存期间创建和关闭的新会话没有关联。然后,Nhibernate会感到困惑,因为发现了一个新对象,该对象不是从当前会话加载的,但它有一个现有对象的id


    对于解决方案,请在Google上搜索“NHibernate asp.net会话管理”,您将获得许多关于如何使用asp.net请求周期作为工作单元的好消息。

    您是否有一些回发测试,以便不会两次加载对象?