【问题标题】:Entity Framework Deep Copy实体框架深拷贝
【发布时间】:2013-11-04 20:13:26
【问题描述】:

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

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


这里有更多关于我的问题的详细信息...我仍在努力解决。

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

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

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

【问题讨论】:

  • 没必要,使用DbEntityEntry.OriginalValues
  • 这里是关于我的问题的更多细节......我仍在努力解决。我有一个 xaml 屏幕,其网格绑定到库存项目列表。这些项目是一个实体集。当我希望用户编辑其中一项时,我将当前实体的值复制到相同类型的对象“EntityToEdit”中。用户进行更改、保存,然后列表会随着更改自动刷新。当用户选择另一个项目进行编辑时会出现此问题。第二项以某种方式随着对第一项所做的更改而发生了变化……我怎样才能打破“链接”?!?

标签: entity-framework deep-copy


【解决方案1】:

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

首先,我不建议将实体直接绑定到您的 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,您可以完全控制如何将值提交给哪个对象。这将帮助您避免意外更改原始对象。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2010-11-30
    • 2012-04-12
    • 1970-01-01
    • 2015-01-13
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多