2012-05-19 69 views
2

我已經在我的測試基類有一個方法幫手,看起來像這樣:如何設置NHibernate的會議,急於取

protected TEntity Fetch<TEntity>(Guid id) where TEntity : Entity 
{ 
    using (var session = GetSession()) 
     return session.Get<TEntity>(id); 
} 

所以我可以從一個集成測試稱其爲這樣:

var persistedFoo = Fetch<Foo>(foo.Id); 

我如何可以設置我的獲取方法急於會話中獲取所有TEntity性質?

回答

1

根據here你應該使用NHibernateUtility類NHibernate的文檔,所以更改代碼弄成這個樣子應該有所幫助:

using(var session = GetSession()) 
{ 
    var entity = session.Get<TEntity>(id); 
    NHibernateUtil.Initialize(entity); 
} 
+2

很好的瞭解NHibernateUtil。你的答案聽起來很有希望,但它不像你所建議的那樣工作。根據鏈接到的文檔,您必須實際指定要初始化的道具(例如:NHibernateUtil.Initialize(foo.Bars)//將在foo中初始化Bars集合)。在我的情況下,Fetch方法不知道TEntity的道具,所以我不能使用這種方法。我可以使用反思來解決它,但希望有一個更直接的選擇。 – rtorres

0

或者,你可以使用nHib的查詢的一個API(我個人比較喜歡QueryOver)做點像
session.QueryOver<Cat>().Where(cat => cat.Id == id).Fetch(c => c.Kittens).Eager
這給你額外的獎勵,準確控制哪些屬性/集合將被提取。

此外,我們建議您不要抽象掉在倉庫你ISession使用。
它會阻止你從配料等nHibernate功能中受益(請參閱ayende的文章here

+0

正如我在我對Hadi的回答的評論中提到的,問題在於,在我的情況下,Fetch()是通用的,所以它不知道它處理的是什麼類型。因此,我無法應用.Fetch(c => c.Kittens)方法。 – rtorres

+0

如果您已閱讀我鏈接到的文章(以及同一作者的其他幾篇文章),我想您會確信您實際上並不需要這些。你實際上試圖在這裏完成的是在nHibernate之上構建另一個抽象層次。我相信這完全沒有必要。 –

+0

我知道你的意思。正如我在我的問題中提到的,這只是單元測試的一種「便利」方法。這絕不是用於應用程序代碼。 – rtorres