2011-01-26 156 views
2

我在UI層中使用延遲加載時遇到了會話問題。nhibernate延遲加載

我(在DAO層)

public List<Visites> GetVisitesClientQuery(string idClient) 
{ 
    using (ISession session = Repository.TSession()) 
    { 
     var results = (from v in session.Query<Visites>() 
         where v.Clients.Idclient == idClient 
         select v); 

     return results.ToList<Visites>(); 
    } 
} 

的碼片我稱之爲UI層:

var visites = VisiteManager.Instance.GetVisitesClientQuery(lstClients.SelectedValue.ToString()); 
foreach (Visites v in visites) 
{ 
    foreach (Factures f in v.Factures) 
    { 
     ... 
    } 
} 

v.Factures是一個集合。

如果我在使用它的作品(會話打開)中調用它,但在這種情況下,它不起作用,我有這個錯誤。

Initializing[NHibernateTest.BusinessObjects.Visites#036000007935]- 
failed to lazily initialize a collection of role: 
NHibernateTest.BusinessObjects.Visites.Factures, no session or session was closed 

是否可以在UI層中處理延遲加載調用?

回答

4

這裏的問題是你處理你的倉庫內的會話管理(DAO層),這不是一個好主意。

在NHibernate中的一個ISession實現代表'Unit Of Work'。工作單元需要知道'用例'的'背景'才能夠成功地使用這個概念。

但是,您的存儲庫沒有使用它(存儲庫)的用例的「上下文」的概念。 因此,你的DAO層不應該決定何時打開一個ISession,而是你的'應用層'(或者甚至是你的UI層,如果你沒有應用層)應該這樣做,因爲那樣會是知道你的上下文的圖層。

通過這樣做,您確實可以將會話有效地用作工作單元。爲了保存實體,您必須使用同一會話來保存實體,因爲您用來加載該實體的會話。 (否則,您需要將該實體「鎖定」到會話中)。 接下來,它也將解決你的懶加載問題。 :)

+0

但我想我不應該在我的視圖層使用nhibernate函數? ...我發現鏈接http://stackoverflow.com/questions/1379500/nhibernate-removes-dal看起來相關。我很迷茫,所有這一層... – 2011-01-26 16:33:40

1

你應該急切地加載你將會使用的集合與 session.Query()。Fetch(x => x.Factures)。

這將加載與Factures的所有Visites。