Wszystkie przykłady, które znalazłem, odnoszą się do klasy o nazwie ObjectContext, która nie występuje w CTP5. Muszę podkreślić w tym miejscu, CTP5 jest moją pierwszą ekspozycją na Entity Framework.Kod EF EF 4.1 Pierwszy widok dołączonego obiektu jako zmodyfikowanego
Mam odłączone POCO, które dodałem do mojego kontekstu DbContext. SaveChanges nie rejestruje zmiany, jak mogę powiedzieć, że mój kontekst umożliwia aktualizację tego obiektu?
_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
Co robię źle?
Aktualizacja 12/01/2011 Może być oczywiste dla większości, ale jako pierwszy użytkownik czasie EF, nie przyszło mi do głowy, że dołączenie do obiektu, który został już dołączony będzie wyczyścić poprzedniego stanu. To spowodowało wiele bólu. Ale chciałem użyć wzorca repozytorium w bardzo ogólny sposób, sposób, który nie obchodzi, czy obiekt był już dołączony lub został świeżo utworzony w wyniku powiązania MVC ASP.NET. Potrzebowałem więc metody UpdateUser
i dołączyłem ją poniżej.
public User UpdateUser(User user) {
if (_context.Entry(user).State == EntityState.Detached) {
_context.Users.Attach(user);
_context.Entry(user).State = EntityState.Modified;
}
return user;
}
Metoda oczywiście zakłada, że obiekt istnieje w magazynie danych w jakiś sposób, to nazywa UpdateUser
po wszystkim. Jeśli obiekt jest już podłączony, skorzystasz z poprzedniego stanu obiektu, co z kolei umożliwi zoptymalizowaną aktualizację do bazy danych. Jednakże, jeśli obiekt nie został przyłączony, metoda wymusza całkowite zabrudzenie.
Wydaje się oczywiste, nie było wcześniej. Mam nadzieję, że to komuś pomaga.
Rich
Doskonale, dziękuję. Dla wszystkich, którzy nie wiedzą, EntityState znajduje się w bibliotece DLL System.Data.Entity. – kim3er
Nie ma problemu, cieszę się, że pomogło :) –
omg Nie mogę ci wystarczająco podziękować. Próbowałem to rozgryźć przez dwa dni. –