NHibernate 和 INotifyPropertyChanged
Posted
技术标签:
【中文标题】NHibernate 和 INotifyPropertyChanged【英文标题】:NHibernate and INotifyPropertyChanged 【发布时间】:2010-09-14 01:51:19 【问题描述】:我在绑定到使用延迟加载从 NHibernate 检索到的对象时遇到了一些问题。我已经阅读了一些关于这个问题的内容,并且对我需要做些什么来解决这里的问题感到困惑。
据我了解,问题与 NHibernate 处理尚未加载的事物的代理的方式有关。是否有人使用延迟加载和 INotifyPropertyChanged 实现了 NHibernate?
现在,如果我禁用延迟加载,INotifyPropertyChanged 可以工作,但如果 UI 元素绑定到延迟加载的内容,则不会更新它们。我已经对这一切有点不知所措了,代理实现对我来说更加陌生,所以我并不完全是我在这里所需要的。 :) 我希望有一些相当简单的解决方案。
【问题讨论】:
ayende.com/Blog/archive/2009/08/07/… 我试过这个,但我不确定它是否适用于 NHibernate 查询生成的代理。至少它对我不起作用。 如何(具体地)没有工作? 我遇到了同样的问题,即延迟加载关闭时没有 UI 更新。我设置了一些断点并调用了拦截函数,创建函数也是如此。然而,在拦截中,它永远不会进入 ...== typeof(INotifyPropertyChanged) 块,这对我来说似乎很奇怪。它确实进入了 (invocation...StartsWith("set_")) 块。如果它进入那个块,似乎应该在 UI 端发生一些事情。正如我所说,我在这些东西上有点挣扎,但如果我能把它敲掉,那么我就可以重新制作 UI,而不必处理一段时间的数据。 【参考方案1】:我想通了。我需要按照此处的示例进行操作: http://www.progware.org/Blog/post/NHibernate-PropertyChanged-event-and-WPF.aspx
似乎缺少的步骤是我需要一个 ProxyFactoryFactory 来返回此示例创建的数据绑定工厂: http://ayende.com/Blog/archive/2009/08/07/nhibernate-amp-inotifypropertychanged.aspx
希望这对某人有所帮助。
【讨论】:
【参考方案2】:如果您确定您已经使用 NH Interceptor 代理了您的域,那么一切都应该可以正常工作。除非您在会话管理上犯了错误,因为拦截在会话范围之外不起作用。您是否对存储库的每个方法调用都进行了微管理?
实际上非网络应用程序的最佳实践是管理每个表单的会话,也许你已经阅读了this,那篇文章解释了管理每个表单的会话,但解决方案有点脏,因为会话分布在演示者中。
我见过的最干净的会话管理是 uNhAddins 与 Castle Adapter,您只关心 configuration 其余部分您自然地编写存储库和服务。这是技术参考:part 1、part 2、part 3、part 4。
我最喜欢的例子是this one,但是在 WPF 的上下文中你应该看看this one。
希望有所帮助。
【讨论】:
某些链接已损坏,因为他们现在使用的是 mercurial【参考方案3】:问题是绑定期望属性更改事件的发送者是代理对象,但它实际上是代理的目标对象。这会导致绑定忽略该事件。
我遇到了同样的问题,我通过实现一个新的 NHibernate 代理来解决它,该代理拦截对 PropertyChanged 事件的订阅并将它们订阅到它自己的事件。然后,当目标引发事件时,它会将其传递给代理订阅者,但会用代理替换发送者。
我在这里写了一篇关于它的博客文章:http://calebvear.blogspot.com/2011/04/wpf-bindings-not-updating-when.html
【讨论】:
以上是关于NHibernate 和 INotifyPropertyChanged的主要内容,如果未能解决你的问题,请参考以下文章
将 NHibernate 开放会话合并到 DB(耦合 NHibernate 和 DB 会话)