2017-09-07 1 views
0

사용자가 레코드를 편집 할 수 있도록 EditWindow으로 전달되는 PhoneRecord이 있습니다. 각 PhoneRecord에는 CostCode 유형이 있습니다. EditWindow에서 나는 SelectedRecord에 대한 참조를 깨기 위해 레코드를 복제하므로 사용자가 취소를 클릭하면 PhoneRecord의 수정되지 않은 버전을 다시 전달할 수 있습니다.전달 ICloneable 클래스가 프록시 오류를 throw합니다

public ModifyPhoneRecordViewModel(PhoneRecord passedRecord) 
{ 
    SelectedRecord = passedRecord; 
    _tempRecord = passedRecord.Clone() as PhoneRecord; 
} 

PhoneRecord 그래서 여기 EF에 의해 생성 된 부분 클래스 I 사용자가 클릭하면에 ICloneable

partial class PhoneRecord : ICloneable 
{ 
    public object Clone() 
    { 
     return (PhoneRecord)MemberwiseClone(); 
    } 
} 

을 구현 나는 _tempRecord을 다시 전달 취소하고 일부 작업을 수행하는 방법입니다 : 여기에 내가 복제하는 방법이다

private void ProcessCancelCommand(PhoneRecord passedRecord) 
{ 
    DataGridRecords[DataGridRecords.IndexOf(DataGridRecords.FirstOrDefault(c => c.Id == passedRecord.Id))] = passedRecord; 

    SelectedRecord = passedRecord; 

    Application.Current.MainWindow.Activate(); 
} 

호 : 그것은 원래의 상태가 DataGrid/TextBoxes에의에 그것으로 처리 되 돌리는 Wever에게,이 오류가 발생하고 CostCode은 전멸되고 TextBox :

가있는 방법이 있나요 "프록시에 저장된 엔터티 래퍼가 동일한 프록시를 참조하지 않습니다"나는 이것을 막을 수 있으므로 PhoneRecord을 유효한 CostCode과 함께 되돌릴 수 있습니까?

+0

DB 엔티티를 복사하려고합니다. 즉, 지연로드를 사용하므로 프록시 일뿐입니다. 그래서 코드에서 오류가 발생합니다. https://stackoverflow.com/questions/25770369/get-underlying-entity-object-from-entity-framework-proxy 비현실적인 메소드를 제공합니다. –

+0

@DanilEroshenko 그래서'var x = ObjectContext.GetObjectType (_tempRecord.GetType());'? 그게 어떻게 나에게 유용한 PhoneModel을 돌려 주나요? – CBreeze

+0

사실 나는 UnProxy 메서드를 가리키고있었습니다. 또한 나는 또한 직렬화를 사용하여 복제가 작동해야한다고 생각합니다 https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-of-an-object-in-net-c-specifically –

답변

0

당신은 당신의 개체 복제하는 MemberwiseClone() 방법을 사용하지 시도해 볼 수도 있습니다 :

EntityFramework - Entity proxy error

을 ...하지만 단순히 새로운 엔티티 클래스 자신을 만들 :

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

당신이하지를 프록시 클래스를 복제하려고합니다.

+0

@CBreeze : 도움이되는 답변에 투표하는 것을 잊지 마십시오. https://stackoverflow.com/help/someone-answers – mm8

관련 문제