Jak skopiować encję z jednego kontekstu (dziedzicząc z DbContext
) do innego?Jak skopiować encję z jednego kontekstu Entity Framework do innego?
Wszystko, co znalazłem działa tylko dla ObjectContext
, ale nie dla DbContext
lub używa DbContext
, ale nie działa.
Na przykład, znalazłem/próbowałem:
- Używa ObjectContext: CloneHelper na CodeProject
- Ustawienie LazyLoadingEnabled do fałszywych wyników w nie wypełniania ICollection <> właściwości (zagranicznych klucze)
- ustawienie ProxyCreationEnabled na fałszywe wyniki w utrzymywaniu właściwości ICollection <> jako puste (klucze obce).
- Entry <> .State = Oddzielne wyniki nie wypełniają ICollection <> właściwości (klucze obce), jeśli ustawione przed dołączeniem właściwości, lub blokuje identyfikator rozliczania, jeśli zostanie ustawiony później.
- AsNoTracking() powoduje wyjątek (jedna z następujących zależności czy wkładania do pierwszego pilota kontekście przedmiot z rodzica interfejs ICollection <> nieruchomości czy najpierw macierzystego)
- dominującej: obiekt w ' Rola ModelFirstSub_First_Target "nie może być automatycznie dodana do kontekstu, ponieważ została pobrana przy użyciu opcji NoTracking merge. Jawnie dołącz encję do ObjectContext przed zdefiniowaniem relacji.
- Pozycja: Nie można dodać lub dołączyć obiektu, ponieważ jego EntityReference ma wartość właściwości EntityKey, która nie jest zgodna z EntityKey dla tego obiektu.
będę go używać w dwóch celach:
- skopiować wszystko z jednej bazy danych na inny (docelowy będzie klonem oryginału; lokalna kopia zdalnej bazy danych). Identyfikatory obiektów powinny zostać zachowane.
- Dodawaj lub aktualizuj wybrane obiekty z jednej bazy danych do innej (upstreaming zmian w lokalnej pamięci podręcznej do zdalnego pochodzenia). Identyfikatory nowo utworzonych obiektów nie muszą być zachowywane.
Jak to zrobić?
EF 6.1.1, 4.5.2 .NET, C#
Oto kod test, który próbuje symulować drugą operację (zmiany upstreaming powrotem do zdalnej bazy danych):
var addedFirst = localContext.Firsts.AsNoTracking().Single(m => m.Id == 4);
var updatedFirst = localContext.Firsts.AsNoTracking().Single(m => m.Id == 2);
addedFirst.Items.First().Id = 0;
addedFirst.Items.First().FirstId = 0;
addedFirst.Id = 0;
remoteContext.FirstItems.Add(addedFirst.Items.First());
remoteContext.Firsts.Add(addedFirst);
var originalFirst = remoteContext.Firsts.Single(m => m.Id == 2);
var originalItem = originalFirst.Items.First();
originalItem.Title = updatedFirst.Items.First().Title;
Tutaj jest to model:
public class ModelFirstBase
{
public virtual int Id { get; set; }
public virtual ICollection<ModelFirstSub> Items { get; set; }
public virtual string Title { get; set; }
}
public class ModelFirstSub
{
public virtual int Id { get; set; }
public virtual int FirstId { get; set; }
public virtual ModelFirstBase First { get; set; }
public virtual string Title { get; set; }
}
PS: właściwości musi być trzymane jako wirtualny model dzielone z aplikacji produkcyjnych, które korzysta z dynamicznych serwerów proxy.
czy wypróbowałeś kontekst odłączyć i dołączyć metody? –
Nie ma takich metod w DbContext. – alik
Context.Set() .Attach (poco) lub Context.Set (typ pocoType) .Attach (poco) wersja. DbContext obsługuje wiele typów tabel. Dołączasz/odłączasz się do jednego z (n) zestawów. Nie kontekst bezpośrednio –