在我的類中使用lazy =「true」會導致我的應用程序完美工作,但性能很糟糕。當我從一個教程創建這個教程時,我只是想盡快開始工作。 (我使用這個教程:http://geekswithblogs.net/BobPalmer/archive/2010/04/23/mapping-object-relationships---quickstart-with-nhibernate-part-3.aspx這是非常有用的東西,快速工作)懶惰加載不與NHibernate合作
我不需要它來加載所有這些多對一的類,當我只需要使用一個對象,所以重新開啓延遲加載是有意義的。然後,我查看了這些對象,除了主對象內的多對一類的例外外,什麼也看不到。當我嘗試以供以後使用這些屬性,我得到以下錯誤:
"Could not initialize proxy - no Session."
我猜這意味着,本次會議是封閉的,所以想偷懶加載額外的對象時失敗。我的會話提供看起來像這樣(爲教程一樣):
class SessionProvider {
private static ISessionFactory _sessionFactory;
private static Configuration _config;
public static ISessionFactory SessionFactory {
get {
if (_sessionFactory == null) {
_sessionFactory = Config.BuildSessionFactory();
}
return _sessionFactory;
}
}
private static Configuration Config {
get {
if (_config == null) {
_config = new Configuration();
_config.AddAssembly(Assembly.GetCallingAssembly());
}
return _config;
}
}
}
然後用我的存儲庫這樣的:
using (var session = GetSession()) { ... }
從這個函數獲取會話:
private static ISession GetSession() {
return SessionProvider.SessionFactory.OpenSession();
}
所以我的問題是,我期望在這裏做什麼?保持會話打開?使其在所有存儲庫中保持靜態?我沒有足夠的經驗與NHibernate瞭解如何工作呢。我現在的首要任務是隻從數據庫中讀取數據,如果這有什麼不同。這是一個代碼庫,最終將在我們的網站和各種C#.Net應用程序中使用。
這兩篇文章有助於:http://blogs.hibernatingrhinos.com/nhibernate/archive/0001/01/01/the-repository-pattern.aspx和http://nhforge.org/wikis/patternsandpractices/nhibernate-和-the-unit-of-work-pattern.aspx我會將此標記爲答案,但我想知道更多關於當我嘗試在Web應用程序和Windows應用程序中使用它時會發生什麼情況。我是否應該創建一些內容,以根據應用程序類型在兩個會話之間切換以提供模式? – Chris 2011-03-07 16:10:55
對於您想要的Windows應用程序:使用斷開連接的會話,或者每個屏幕有一個會話(您仍然可以在此使用工作單元模式)。但是,你應該真的考慮擁有一臺服務器,這樣你就不會有太多的客戶端在同一個數據庫上。 – jonnii 2011-03-07 16:19:29
是的,但我也將在Web應用程序中使用它。如何檢查應用程序是否在ASP.Net應用程序中運行?我看到我需要檢查HttpContext,但默認情況下它未啓用。我假設只是啓用它並檢查它是否爲空將不是這裏的最佳做法。 – Chris 2011-03-08 14:48:43