【问题标题】:NHibernate & Cancelling Changes to EntitiesNHibernate 和取消对实体的更改
【发布时间】:2010-03-30 12:09:11
【问题描述】:

这似乎是一个常见问题,但我不知道解决它的最佳方法。我希望能够将实体发送到视图,对视图中的实体进行更改,但如果用户取消视图,则取消(删除)这些更改。这样做的正确方法是什么。

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

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

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

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

编辑:

好的,所以如果我正在实现方法 (2),那么 evict 方法就是要走的路。谢谢,我不记得那个细节了。然而,视图对象引用我的旧实体的问题使得该问题难以处理。当我的自定义驱逐事件引发时,我不能让我的视图自动更新到一个新实体,而不需要在每个实体中重新绑定自定义代码。在某些情况下,重新绑定可能并非易事。我需要再考虑一下,因为我可能过于复杂,但目前,这种方法似乎更棘手。

我怀疑我会被方法 (1) 卡住,它有自己的一系列问题,但会等待更长时间,看看其他人是否有一些想法。

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

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

【问题讨论】:

  • 当实体具有级联关系时,Refresh 的常见问题会发生,然后这些子实体(相关实体)也将被刷新 - 这可能会导致明显的性能影响。我刚刚遇到了我所描述的问题,因此这些信息可能对其他人有所帮助

标签: c# .net nhibernate entity


【解决方案1】:

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

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

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

【讨论】:

  • 我最终使用了这个解决方案。不过我觉得它并不理想,因为有时我的实体包含的正是我认为应该包含的内容,而且我不喜欢将它们的属性复制到其他东西上。不过,在大多数情况下似乎还可以。谢谢
  • 最后你会习惯的。我建议使用 Automapper 来减轻来回复制数据的痛苦。 automapper.codeplex.com
  • 一开始很痛苦,实现第二种类型只是为了将模型/数据的形状更改为适合视图的形状的想法让我想尖叫! - 我与这个想法抗争了将近一年,最终不得不面对这样一个事实,即 NH 和 ASP.NET MVC 并不是为任何其他方法而设计的。即使它让你畏缩,我强烈建议你忘记 DRY 并接受高度重复;这就是这些工具的设计目的。逆流游泳会带来痛苦,但没有真正的回报。
【解决方案2】:

最好的方法是在用于加载对象的ISession 上调用Evict 方法。这将从会话缓存中删除对象。然后您可以重新加载并重新显示它。

从会话中逐出对象使其 transient 分离,因此如果项目中仍有对它的引用,则在刷新会话时它们将不会被持久化。你如何处理这取决于你的应用程序,但我建议引发一个事件来通知订阅者他们需要重新加载对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多