Czy muszę ręcznie ustawiać właściwości klucza obcego, gdy zmieniam skojarzenia?
Przeprowadzam migrację z Linq-SQL do Entity Framework (4.4), używając bazy danych First z DbContext. Zastanawiam się, czy następujące zachowanie jest normalne:
using (var e = new AgendaEntities()) {
var store = e.Stores.First();
var office = e.Offices.Create();
office.Store = store; // Set association
Console.WriteLine(office.StoreID); // shows Guid.Empty, expected store.ID!
}
W L2S, ustawianieStore
skojarzenie z jednostką również zaktualizowałobyStoreID
klawisz. W EF wydaje się, że tak się nie dzieje. Dzieje się tak niezależnie od tego, czy elementy są nowe czy załadowane z kontekstu.
Kiedy jaSaveChanges
, zapisuje poprawnie iStoreID
jest aktualizowany, aby pasowałoffice.ID
, ale dlaczego tak się dzieje dopiero po zapisaniu?
Czy czegoś brakuje, czy mam teraz synchronizować klucze zagraniczne ręcznie?
Edycja rozwiązania: Nazywa się to naprawianiem właściwości i było wykonywane automatycznie przez wygenerowane proxy. Jednak zDbContext
to już nie przypadek. Wedługten problem z połączeniem, to z założenia.
Witaj, szablon DbContext w rzeczywistości nie generuje klas, które będą używane jako proxy śledzenia zmian - tylko leniwe ładowanie proxy (które nie robią naprawiania). Podjęliśmy tę decyzję, ponieważ proxy śledzenia zmian są złożone i mają wiele niuansów, które mogą być bardzo mylące dla programistów. Jeśli chcesz, aby poprawka wystąpiła przed SaveChanges, możesz wywołać myContext.ChangeTracker.DetectChanges. ~ Zespół EF
Alternatywą jest zadzwonićDbContext.Entry(entity)
, który zsynchronizuje obiekt. Jest to opisane w tym artykule:Relacje i właściwości nawigacji w sekcji „Synchronizacja zmian między FK a właściwościami nawigacji”