【发布时间】: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