0

我有一个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:

“存储在代理中的实体包装器没有引用同一个代理”

有没有一种方法可以防止这种情况发生,以便我可以通过PhoneRecord有效的方式传回 a CostCode

4

1 回答 1

0

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

EntityFramework - 实体代理错误

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

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

您不想克隆代理类。

于 2017-09-07T10:04:46.067 回答