2010-12-10 17 views
21

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

Odpowiedz

29

Kiedy dołączyć podmiot, to idzie do Bez zmian stanie (nie została zmieniona, ponieważ dołączony do kontekstu). Wszystko, co musisz to wyraźnie zmienić podmiot publiczny do Modified:

_context.Users.Attach(user); 
_context.Entry(user).State = System.Data.Entity.EntityState.Modified; 
_context.SaveChanges(); 
+0

Doskonale, dziękuję. Dla wszystkich, którzy nie wiedzą, EntityState znajduje się w bibliotece DLL System.Data.Entity. – kim3er

+0

Nie ma problemu, cieszę się, że pomogło :) –

+2

omg Nie mogę ci wystarczająco podziękować. Próbowałem to rozgryźć przez dwa dni. –

4

Dla kompletności, można uzyskać dostęp do ObjectContext przez odlewanie DbContext do IObjectContextAdapter:

((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified); 

metodę Morteza za jest znacznie czystszy i dostaje mój głos.

+0

Dziękuję, pomyślałem, że brakuje mi czegoś oczywistego. – kim3er

2

Uważam, że nie musisz dołączać obiektu przed zmodyfikowaniem połączenia. po prostu ustawienie modyfikacji spowoduje wykonanie zadania.

if (_context.Entry(user).State == EntityState.Detached) 
{ 
    _context.Entry(user).State = EntityState.Modified; 
} 
Powiązane problemy