【问题标题】:Passing ICloneable Class throws Proxy error传递 ICloneable 类会引发代理错误
【发布时间】: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 中删除:

"存储在代理中的实体包装器没有引用相同的 代理”

有没有办法可以防止这种情况发生,以便我可以传回带有有效CostCodePhoneRecord

【问题讨论】:

  • 您正在尝试复制使用延迟加载的数据库实体,因此它只是一个代理。这就是代码抛出错误的原因。 stackoverflow.com/questions/25770369/… 提供非代理方法
  • @DanilEroshenko 那么我需要使用类似var x = ObjectContext.GetObjectType(_tempRecord.GetType()); 的东西吗?那如何返回一个可用的PhoneModel 给我?
  • 我实际上是指着 UnProxy 方法。另外我认为使用序列化的克隆也应该工作stackoverflow.com/questions/129389/…

标签: c# wpf entity-framework icloneable


【解决方案1】:

您可以尝试不使用MemberwiseClone() 方法来克隆您的实体:

EntityFramework - Entity proxy error

...但只需自己创建一个新的实体类:

partial class PhoneRecord : ICloneable
{
    public object Clone()
    {
        return new PhoneRecord()
        {
            CostCode = this.CostCode,
            //+ all other properties...
        }
    }
}

您不想克隆代理类。

【讨论】:

  • 假设您有 100 多个属性。这会让你的头爆炸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2016-12-19
  • 2021-10-19
  • 2016-02-03
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多