看来这将是一个普遍的问题,但我不知道解决该问题的最佳方法。我希望能够将实体发送到 View ,对 View 中的实体进行更改,但是如果用户从 View 中取消,则取消(删除)那些更改。什么是执行此操作的正确方法。

我有两个选择,但我认为应该有其他更好的选择

1)获取一个实体,创建一个克隆,将克隆发送到 View ...如果接受更改,则使用克隆的值更新原始实体

2)将实体发送到 View ,如果用户取消,则从NHibernate的缓存中删除该实体,然后从数据库中重新加载它

对于(2),对我来说,问题在于,从缓存中删除旧实体后,仍然可以在我的整个项目中引用该旧实体。

编辑:

好的,因此如果我要实现方法(2),则必须采用evict方法。谢谢,我不记得那个细节。但是,引用我的旧迁出实体的 View 对象问题使该问题难以解决。我不能只是在 View 中自动更新到一个新实体,而不必在每个实体中都有自定义代码以在引发自定义逐出事件时重新绑定(bind)。在某些情况下,重新绑定(bind)可能并不容易。我可能需要考虑的更多,因为我可能会过于复杂,但此刻,此方法似乎比较棘手。

我怀疑我会被方法(1)困扰,该方法有其自身的一系列问题,但将等待更长的时间才能看到其他人是否有一些想法。

编辑2 :刚刚找到了这个。我认为它几乎涵盖了详细答案,并且附带了一个出色的演示项目-与NHibernate构建桌面待办事项应用程序-http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

除此之外, NHibernate还有一个Session.Refresh(对象实体)函数,它似乎可以解决确切的问题。因此,当一个实体被更改但随后在保存之前被取消时,我可以调用Session.Refresh从数据库中重新加载它并放弃更改。

最佳答案

我将选择选项1,并使用所谓的ViewModel代替您的实体。
ViewModel是您为特定 View 建模的表示。在ViewModel中,您可以混合来自不同实体的数据和预格式化值以适合 View 。是将数据传递到 View 的一种优雅方式,您可以轻松完成所需的操作。

使用ViewModels已成为在ASP.net MVC和Silverlight/WPF中工作的首选方式。

要了解有关Viewmodels的更多信息:http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

关于c# - NHibernate和取消实体更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2544947/

10-17 00:21