2011-01-05 96 views
3

HI,asp.net自定義角色提供NHibernate的錯誤

我實現我的NHibernate應用 自定義角色提供我有我打電話時,我想訪問NHibernate會話的存儲庫。

所以,當我的角色提供初始化自身

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) { 

      base.Initialize(name, config); 
      Repository = new Repository(); 
     } 

然後我重寫

public override string[] GetRolesForUser(string username) { 
     var users = Repository.QueryAll<Users>(); 

//然後我濾芯等

} 

但是,當這個函數被調用我總是會出現NHibernate會話關閉的錯誤。 我調試了nhibernate源代碼,事實證明,這裏的會話有一個不同的guid,我的控制器中的會話(我也使用ASP.NET MVC)。 當我到達這裏時,這個特定的會議關閉。 我不知道是誰關閉它。我知道它是在應用程序啓動時啓動的,然後才啓動。

有沒有人有任何想法我做錯了什麼? 我想在此提供程序中仍然使用Nhibernate,但不會再出現錯誤。 謝謝

+0

什麼是你的會話管理策略? – 2011-01-05 21:02:25

+0

我在application_start上啓動一個會話工廠,並在存儲庫構造函數中獲得了cureent會話 – Para 2011-01-06 07:30:36

+0

我指的是何時何地打開和關閉會話? – 2011-01-06 14:25:35

回答

1

這是我如何修復它。

在我的倉庫類我有這樣的:

public Repository() 
{ 
    this.Session = SessionManager.GetCurrentSession(); 
} 

我刪除了構造完全 我把這個代替:

private ISession _session; 
     protected ISession Session 
     { 
      get 
      { 
       if (_session == null) 
       { 
        _session = SessionManager.GetCurrentSession(); 
       } 
       return _session; 
      } 
     } 
2

我有什麼似乎是完全相同的問題。不要忘記角色和成員資格提供者只是實例化一次,並存在於應用程序的整個生命週期中。如果您使用的是每個Web請求模式的會話,那麼ISession將在第一個請求之後關閉,然後對提供程序內部的ISession的任何引用對於後續請求都可能爲空。

你可以通過注入一個對ISessionFactory的引用來調用GetCurrentSession,而不是直接持有對ISession的引用。

相關問題