0

我有一个允许店员编辑信息的网络应用程序。我会在编辑开始之前复制一个实体,以防用户决定取消更改。问题是对副本所做的任何更改都会应用于原始对象。

在 C# 中,我会创建一个深拷贝来避免这个问题,但是这个应用程序正在使用实体框架......我不确定如何对实体进行深拷贝。


这是有关我的问题的更多详细信息...我仍在尝试解决。

我有一个 xaml 屏幕,其网格绑定到库存项目列表。这些项目是一个实体集。当我希望用户编辑其中一项时,我将当前实体的值复制到相同类型的对象“EntityToEdit”中。用户进行更改、保存,然后列表会随着更改自动刷新。

当用户选择另一个项目进行编辑时会出现此问题。随着对第一项的更改,第二项以某种方式发生了更改....

我怎样才能打破“链接”?!?

4

1 回答 1

0

你的问题有很多东西,我几乎不知道从哪里开始。

首先,我不建议将实体直接绑定到您的 UI。相反,我建议在数据库和应用程序的表示层之间使用某种形式的抽象。

有几种既定的最佳实践模式可供使用,主要取决于您工作的技术环境。查看 MVC 模式(模型-视图-控制器)或MVVM(模型-视图-视图模型) .

关于您的深层副本,有很多可能的解决方案。您可以在 StackOverflow 上找到一些内容,例如:“How do you do a deep copy an object in .Net?” ,其中对象被序列化为 Stream。尽管我也使用了这种深拷贝,但我尽量避免这种情况。我只看到真正需要深拷贝的极少数情况。

您还应该考虑[IEditableObject][4]在要编辑的那些对象上实现接口。这使您可以轻松地构建提交编辑值的时间和方式,并通过实施简单的方法(如BeginEdit()EndEdit()和)来选择或取消或重置您的编辑CancelEdit()。一些开箱即用支持此接口的 .NET 控件,如果这些接口方法存在于您的对象中,则它们会自动调用它们。

通过实现IEditableObject,您可以完全控制如何将值提交给哪个对象。这将帮助您避免意外更改原始对象。

于 2013-11-13T14:06:08.843 回答