Un grafico può essere staccato da un ObjectContext e riattaccato ad un altro?

Ho provato quanto segue per staccare un grafico di oggetti entity framework e quindi collegarlo a un nuovo contesto:

// create a context var ctx = new TestEntities(); var parents = ctx.Parents; // populate the graph var newParent = new Parent {Nb = 1, Title = "Parent1"}; parents.AddObject(newParent); newParent.Children.Add(new Child {Nb = 1, Title = "Child1"}); // put all entity objects in Unchanged state before detaching ctx.SaveChanges(); // detach all entity objects foreach (var objectStateEntry in ctx.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached)) ctx.Detach(objectStateEntry.Entity); // create a new context ctx = new TestEntities(); // attach graphs to new context foreach (var p in parents) ctx.Attach(p); 

Ho due problemi con questo approccio:

  1. Dopo aver scollegato tutti gli oggetti quadro, newParent.Children diventa vuoto
  2. Viene sollevata un’eccezione InvalidOperationException quando si ricollega dicendo che “Un object entity framework non può essere referenziato da più istanze di IEntityChangeTracker”.

Qualcuno sa come staccare correttamente un grafico da un ObjectContext e ricollegarlo ad un altro?

AGGIORNARE:

Ok buone notizie per me, ho capito come cambiare la connessione del database sottostante all’interno dello stesso ObjectContext, quindi non ho più bisogno di staccare / attaccare. Se qualcuno è interessato, ecco come lo faccio (qui uso SQLite e cambio il file del database):

 var sc = ((EntityConnection)ctx.Connection).StoreConnection; sc.ConnectionString = @"Data Source=" + newFile + ";"; 

Accetterò la risposta di Ladislav in quanto sembra corretta e risponde alla mia domanda come è stato chiesto.

È necessario creare un clone profondo dell’intero grafico e collegarlo a un altro contesto. Il clone profondo viene creato attraverso la serializzazione. L’approccio comune è utilizzare DataContractSerializer :

 var serializer = new DataContractSerializer(typeof(Parent)); serializer.WriteObject(stream, attachedEntity); stream.Seek(0, SeekOrgin.Begin); detachedEntity = (Parent)serializer.ReadObject(stream); 

Per fare in modo che le tue quadro non debbano contenere riferimenti circolari (il genitore ha proprietà di navigazione su Child e Child ha proprietà di navigazione su padre) oppure devi utilizzare DataContract(IsReference=true) e DataMember sugli DataMember per informare il serializzatore che deve tracciare i riferimenti risolvere il problema di riferimento circolare.