NHibernate,ISession每个演示者,多个演示者打开

时间:2011-06-29 09:47:50

标签: .net nhibernate mvp

你将如何解决以下情况:该应用程序是基于MVP(WinForms),同时我可以有多个演示者显示。每个演示者都附加一个会话,并在演示者的生命周期内打开。

如果我在一个演示者中加载一个实体并将其传递给另一个演示者以显示它,如果该实体有一些集合,我会“非法尝试将一个集合与两个打开的会话相关联”。

现在,我的架构有问题吗?打开多个会话时我没有看到任何问题(连接当然不是一直打开的。)

非常感谢任何意见!

2 个答案:

答案 0 :(得分:4)

使用NHibernate从数据库检索数据时,返回的实体对象与实现它们的ISession实例相关联。涉及任何这些对象的数据库的所有后续操作必须通过相同的ISession实例执行。这包括通过延迟加载来获取相关的实体集合。

解决此问题的一种方法是确保与实体对象关联的任何集合在将其传递到另一个会话之前已经填充。有几种方法可以实现这一目标:

  1. 您可以在检索实体对象后通过简单地访问实体对象上的相对属性来加载集合,从而触发延迟加载
  2. 您可以通过急切加载检索实体对象及其关联的集合。
  3. 请注意,在这两种情况下,您应该通过调用ISession.Evict方法将实体对象从其会话中完全分离,然后再将其传递给另一个会话。

答案 1 :(得分:3)

Denis,我一直在MVP Winforms应用程序中遇到完全相同的问题,我们能够找到可靠地解决问题的最佳方法是转移到“持久对话”模型而不是“每个演示者会话”。

此前的问题包含您需要的许多链接

Example of nhibernate winform application