【问题标题】:NHibernate, ISession per presenter, multiple presenters openNHibernate,每个演示者的 ISession,多个演示者打开
【发布时间】:2011-06-29 18:55:53
【问题描述】:

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

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

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

任何意见都非常感谢!

【问题讨论】:

    标签: .net nhibernate mvp


    【解决方案1】:

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

    解决此问题的一种方法是确保与实体对象关联的所有集合在传递给另一个会话之前都已填充。有几种方法可以实现这一点:

    1. 您可以在检索到实体对象后加载集合,只需访问实体对象上的相关属性即可,从而触发延迟加载
    2. 您可以通过即时加载检索实体对象及其关联的集合。

    请注意,在这两种情况下,您都应该通过调用ISession.Evict 方法将实体对象与其会话完全分离,然后再将其传递给另一个对象。

    【讨论】:

    • 是的,我认为这是使用这种模式做事的最佳方式(每个演示者的会话),替代方法可能是我传递对象的 Id 而不是实际的实体,然后离开它到第二个演示者的会话以获取该实体的副本;但 Evict 现在更干净了。谢谢
    【解决方案2】:

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

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

    Example of nhibernate winform application

    【讨论】:

    • 我之前研究过每个业务事务的会话,但没有时间实施和真正测试这种模式。只要有时间,我就会升级我的架构,因为我可以看到拥有这样的东西的明显好处。尽管我确信 uNhAddins 确实是高质量的代码和工作,但我对盲目地集成其他人的代码有点小心。目前,我坚持每个演示者的会话和 Enrico 建议的 Evict 呼叫。
    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多