2009-01-28 48 views
1

我有一個非常奇怪的問題:NHibernate崩潰時,從Web用戶控件調用。NHibernate崩潰時,ASP.Net中的Web用戶控件調用

我正在使用NHibernate訪問數據庫的ASP.Net(2.0)網頁。

而且我有一個簡單的工廠類訪問表中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(); 
     } 
    } 
} 
} 

現在的問題:

  1. 當我訪問CurrentStepNumber從Test.aspx的頁面,一切完美
  2. 當我從中Test.aspx的頁面上它使用的Web用戶控件(test.ascx)閱讀本場還行
  3. 然而時我試圖在後面的控制(test.ascx)代碼中的值賦給CurrentStepNumber我總是得到一個異常:

NHibernate.NonUniqueObjectException:不同的對象具有相同標識符值已關與會議

其實SaveOrUpdate NHibernate Repository的方法拋出異常。

我找不出什麼可能是這裏的問題,所以任何幫助將不勝感激。

+0

你有一些PostBack測試,以便該對象不被加載兩次? – BuddyJoe 2009-01-28 20:45:45

回答

0

我認爲你在這裏有一個會話管理問題。 RepositoryFactory.ProjectWizardRepository.GetById如何創建和可能處置NHibernate會話?它創建並關閉會話嗎?

似乎DBHelper.GetProjectEntity()正在創建或加載ProjectEntity。稍後,當我調用CurrentStepNumber的setter時,您可以將該對象插入或更新到數據庫。

問題是,當DBHelper.GetProjectEntity()正在加載一個已存在的對象,並在稍後關閉會話後關閉對象,但保持對象周圍時,我們正在進入深水。當對象稍後更新時,您爲CurrentStepNumber設置一個新值並將對象發送給NHibernate進行保存。這裏的問題是該對象與保存期間創建和關閉的新會話沒有關聯。因爲一個新對象被發現並不是從當前會話加載的,但它有一個現有對象的id,所以Nhibernate會感到困惑。

對於Google的「NHibernate asp.net會話管理」解決方案,您將獲得許多有關如何將ASP.NET請求週期用作工作單元的好處。