2012-07-22 9 views
5

Próbowałem następujących odłączyć wykres obiektów jednostki, a następnie podłączyć go do nowego kontekstu:Czy wykres można odłączyć od obiektu ObjectContext i ponownie dołączyć do innego?

// 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); 

mam dwa problemy z tym podejściem:

  1. Po odłączeniu wszystkich obiektów podmiotu newParent.Children staje się pusty
  2. Wywołuje wyjątek InvalidOperationException podczas ponownego dołączania, informując, że "Obiekt encji nie może być odwoływany przez wiele instancji IEntityChangeTracker".

Czy ktoś wie, jak poprawnie odłączyć wykres od ObjectContext i ponownie dołączyć go do innego?

UPDATE:

Ok dobra wiadomość dla mnie, zorientowali się, jak zmienić podstawową połączenia z bazą danych w tym samym ObjectContext, więc nie trzeba odłączyć/podłączyć więcej. Jeśli ktoś jest zainteresowany, oto jak to zrobić (tutaj używam SQLite i zmienić plik bazy danych):

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

będę akceptować odpowiedź Ladislav jako wydaje się być poprawne i odpowiedzi na moje pytanie, jak to poproszono.

Odpowiedz

3

Musisz utworzyć głęboki klon całego wykresu i dołączyć go do innego kontekstu. Głęboki klon powstaje w wyniku serializacji. Wspólne podejście jest użycie DataContractSerializer:

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

do tej pracy swoje podmioty nie muszą zawierać odnośniki okrągłe (Dominująca posiada właściwość nawigacji do dziecka i dziecko ma właściwość nawigacji rodzica) lub trzeba użyć DataContract(IsReference=true) i DataMember atrybutów Twoje jednostki informują serializatora, że ​​musi on śledzić odniesienia do rozwiązania kołowego problemu referencyjnego.

+0

Nie chcę wykonywać kopii, ponieważ mam stos cofania/ponawiania, który odnosi się do obiektów na wykresie, i nie chcę zgrywać stosu, gdy zmieniam obiekt. Czy znasz jakieś inne podejście, za pomocą którego można zmienić kontekst lub tylko jego obiekt połączenia, a jednocześnie używać tego samego wykresu? –

+1

W takim przypadku musisz użyć tego samego kontekstu dla obu operacji, ponieważ obecnie nie ma możliwości odłączenia jednostki i zachowania jej relacji - dlatego musisz wykonać kopię, aby je zachować. –

+0

Tak, bałem się tego, ale hej, właśnie dowiedziałem się, że mogę zmienić podstawowy ciąg połączenia, więc nie muszę się od razu odłączać/dołączać. –

Powiązane problemy