【发布时间】:2017-09-07 07:40:01
【问题描述】:
我有一个 PhoneRecord 传递给 EditWindow 以便用户能够编辑记录。在每个PhoneRecord 上都有一个CostCode 类型。在EditWindow 上,我克隆了一条记录以打破对SelectedRecord 的引用,以便在用户单击取消时,我可以传回PhoneRecord 的未修改版本。这是我克隆的方法:
public ModifyPhoneRecordViewModel(PhoneRecord passedRecord)
{
SelectedRecord = passedRecord;
_tempRecord = passedRecord.Clone() as PhoneRecord;
}
PhoneRecord 是 EF 生成的部分类,所以这是我如何实现 ICloneable
partial class PhoneRecord : ICloneable
{
public object Clone()
{
return (PhoneRecord)MemberwiseClone();
}
}
当用户单击取消时,我将_tempRecord 传回并对其进行一些处理以恢复到DataGrid/TextBoxes 中的原始状态:
private void ProcessCancelCommand(PhoneRecord passedRecord)
{
DataGridRecords[DataGridRecords.IndexOf(DataGridRecords.FirstOrDefault(c => c.Id == passedRecord.Id))] = passedRecord;
SelectedRecord = passedRecord;
Application.Current.MainWindow.Activate();
}
但是,这会引发错误,并且 CostCode 会从 TextBox 中删除:
"存储在代理中的实体包装器没有引用相同的 代理”
有没有办法可以防止这种情况发生,以便我可以传回带有有效CostCode 的PhoneRecord?
【问题讨论】:
-
您正在尝试复制使用延迟加载的数据库实体,因此它只是一个代理。这就是代码抛出错误的原因。 stackoverflow.com/questions/25770369/… 提供非代理方法
-
@DanilEroshenko 那么我需要使用类似
var x = ObjectContext.GetObjectType(_tempRecord.GetType());的东西吗?那如何返回一个可用的PhoneModel给我? -
我实际上是指着 UnProxy 方法。另外我认为使用序列化的克隆也应该工作stackoverflow.com/questions/129389/…
标签: c# wpf entity-framework icloneable