【问题标题】:Session/Transaction management NHibernate with MVVM databinding带有 MVVM 数据绑定的会话/事务管理 NHibernate
【发布时间】:2012-09-01 02:11:37
【问题描述】:

也许我已经以“理想”的方式这样做了,但不知何故,我觉得它不合适。

我有一个搜索表单,在找到结果后会立即通过不同的控件显示信息(其中三个是相互绑定的数据网格)。

目前我已将我的 UoW 管理设置如下:

  • 当用户开始搜索时,检查我们是否有旧的 UoW 并处理它(它是会话)
  • 创建一个新的 UoW
  • 开始交易
  • 执行搜索
  • 提交事务

代码示例:

if(_unitOfWork != null)
{
    _unitOfWork.Dispose();
}

_unitOfWork = new UnitOfWork();

_unitOfWork.Begin();
ICollection<Case> cases = casesQuery.ToList();
_unitOfWork.Commit();

理想情况下,我现在希望所有对象都被数据绑定,并且在数据绑定完成后,我想处置 UoW。

遗憾的是,我不能这样做,因为延迟加载beeing 对三个数据网格中的两个进行数据绑定。在这些实体中显式加载集合和对象图并不是一个真正的选择,因为其中一些实体是具有不同属性和引用的子类。显式加载这些似乎需要很多工作。

我想知道的是,如果有办法让它变得更好,我考虑了以下几点:

  • 使用转换器获取数据绑定的值,确定它是否是代理,如果是则加载此代理。这意味着我必须为每个数据绑定属性设置一个转换器,这又看起来效率低下
  • 显式加载,上面提到了不这样做的原因
  • 我当前的解决方案是让 UoW 跨越“搜索”,最大的问题是我无法在延迟加载内容时保持事务打开。 (我可以,但这似乎是一件非常糟糕的事情,因为用户可以无限期地保持该交易开放)

有没有人有更好的方法来处理这种情况,或者我目前正在做的最好的事情是什么?

【问题讨论】:

    标签: c# wpf nhibernate data-binding mvvm


    【解决方案1】:

    在 MVVM 应用中,最常见的模式是每个 VM 都有一个会话。这无需太多额外工作即可实现延迟加载和富客户端更改跟踪。

    目前的方法没有任何问题。不能在事务中进行延迟加载并不是什么大不了的事。

    现在,如果您可以创建基于反射的解决方案,显式加载看起来不会“工作量太大”。但是您仍然需要知道要加载什么。无论如何,这比转换器的想法要少得多。

    【讨论】:

    • 是的,我沿着反射路线走。我遇到的最大问题是我必须考虑到某些属性会引用回我不喜欢的父实体(循环引用)。此外,它还会导致整个图形被加载(直到特定的嵌套级别),这也有点削弱了延迟加载的额外好处。我目前拥有的确实是每个 VM 的 UoW,但它只是感觉不像......对我来说光滑整洁,也许我需要习惯它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2015-06-20
    • 2011-02-03
    • 2010-10-26
    相关资源
    最近更新 更多