2011-01-26 158 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。