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:
- Po odłączeniu wszystkich obiektów podmiotu
newParent.Children
staje się pusty - 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.
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? –
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ć. –
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ć. –