我有一个允许职员编辑信息的Web应用程序。我在编辑开始之前复制一个实体,以防用户决定取消更改。问题是对副本所做的任何更改都将应用于原始对象。
在C#中我会创建一个深层副本来避免这个问题,但是这个应用程序正在使用实体框架...我不知道如何对实体进行深层复制。
以下是有关我的问题的详细信息......我仍在努力解决。
我有一个xaml屏幕,其网格绑定到一个库存项目列表。这些项目是EntitySet。当我希望用户编辑其中一个项目时,我将当前实体的值复制到相同类型的对象“EntityToEdit”中。用户进行更改,保存,列表会随着更改自动刷新。
当用户选择要编辑的其他项目时,会出现问题。第二个项目以某种方式随着第一个项目的更改而改变....
如何打破“链接”?!?
答案 0 :(得分:0)
你的问题中有很多内容,我几乎不知道从哪里开始。
首先,我不建议将实体直接绑定到您的UI。相反,我建议在数据库和应用程序的表示层之间使用某种形式的抽象。
可以使用几种已建立的最佳实践模式,主要取决于您正在使用的技术环境。查看MVC模式(Model-View-Controller)或MVVM (Model-View-ViewModel)
关于您的深层副本,有很多可能的解决方案。您可以在StackOverflow中找到一些,如下所示:"How do you do a deep copy an object in .Net?",其中对象被序列化为Stream。尽管我也在使用这种深层复制品,但我尽量避免这种情况。我只看到非常罕见的情况,确实需要深层复制。
您还应该考虑在要编辑的对象上实现[IEditableObject][4]
接口。通过实施BeginEdit()
,EndEdit()
和CancelEdit()
这样的直接方法,您可以通过简单的方式来构建编辑后的值的提交时间和方式,以及选择性地取消或重置编辑内容。 。某些支持此接口的.NET控件是开箱即用的,如果它们存在于您的对象上,则会自动调用这些接口方法。
通过实现IEditableObject
,您可以完全控制值如何提交到哪个对象。这有助于您避免意外更改原始对象。