2017-09-07 1 views
0

J'ai un PhoneRecord qui est passé à un EditWindow afin qu'un utilisateur puisse éditer l'enregistrement. Sur chaque PhoneRecord il y a un type de CostCode. Sur le EditWindow je clone un enregistrement pour casser la référence au SelectedRecord de sorte que dans le cas où l'utilisateur clique sur annuler je peux renvoyer une version non modifiée du PhoneRecord. Voici comment je clone: ​​Passage ICloneable Classe throws Erreur de proxy

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

Le PhoneRecord est une classe partielle générée par EF Voici donc comment je mets en œuvre ICloneable

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

Lorsque l'utilisateur clique résilie sur je passe en retrait de la _tempRecord et faire un peu traitement avec elle pour revenir à son état d'origine dans le DataGrid/TextBoxes:

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

    SelectedRecord = passedRecord; 

    Application.Current.MainWindow.Activate(); 
} 

Ho wever, cela jette une erreur et le CostCode est rayé de la TextBox:

« L'enveloppe de l'entité stockée dans le proxy ne fait pas référence à la même proxy »

Y at-il une façon dont je peut empêcher cela afin que je puisse repasser un PhoneRecord avec un CostCode valide sur elle?

+0

Vous essayez de copier l'entité DB, qui utilise le chargement paresseux et donc c'est juste un proxy. C'est pourquoi le code jette une erreur. https://stackoverflow.com/questions/25770369/get-underlying-entity-object-from-entity-framework-proxy Fournit une méthode non-proxy –

+0

@DanilEroshenko J'ai donc besoin d'utiliser quelque chose comme 'var x = ObjectContext.GetObjectType (_tempRecord.GetType()); '? Comment cela me renvoie-t-il un «PhoneModel» utilisable? – CBreeze

+0

Je pointais à la méthode UnProxy en fait. Aussi, je pense que Clone utilisant la sérialisation devrait également fonctionner https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-of-an-object-in-net-c-specifically –

Répondre

0

Vous pouvez essayer de ne pas utiliser la méthode MemberwiseClone() pour cloner votre entité:

EntityFramework - Entity proxy error

... mais simplement créer une nouvelle classe d'entités vous:

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

Vous n'avez pas vouloir cloner la classe proxy.

+0

@CBreeze: S'il vous plaît n'oubliez pas de voter des réponses utiles: https://stackoverflow.com/help/someone-answers – mm8