2011-01-31 19 views
5

Używam kodów pośredniczących do aktualizacji moich encji, a gdy zaktualizowany obiekt składa się z kolumn, które mają wartości zmienione z wartości niezerowych na wartości null, wartości null nie są przechowywane w bazie danych, tzn. Rekord nadal zawiera poprzednie wartości inne niż null .Entity Framework: Aktualizowanie pola do wartości pustej?

Co robię źle?

public void UpdateEntity(Entity e) 
     { 
      _context.Works.Attach(new Entity{ Id = e.Id }); 
      _context.ApplyCurrentValues("Entities", e); 
      _context.SaveChanges(); 
     } 
+0

Zależy co twój związek jest, jeśli mają związek, trzeba upewnić się, że 0 .. 1 a nie 1 do wielu. –

+0

Wartości, które próbuję zerwać, są prostymi kolumnami bazy danych (np. Date/integer/varchar); chociaż istnieją inne podmioty, które mają 1 ... wiele relacji z jednostką, nie są one w żaden sposób modyfikowane. –

Odpowiedz

2

Problem polega na tym, że trzeba przypisać null do tych właściwości poAttach() ty, nie wcześniej. Być może ApplyCurrentValues() kopiuje tylko nie-już identyczne właściwości? (Nigdy nie testowałem, ale byłoby rozsądnie, gdyby tak było).

+0

Dzięki Craig, myślę, że to może być problem. Nie mogę dołączyć obiektu, zanim uruchomię ApplyCurrentValues ​​(), ponieważ naprawdę zepsułoby to mój wzorzec repozytorium. Aby obejść ten problem, zamiast tego zostałem zmuszony do pobrania encji i ręcznego przekazania wartości zaktualizowanej-odłączonej encji aktualizacji wartości pobranego obiektu przed wywołaniem SaveChanges(). Jestem uszy, jeśli istnieje sposób na uniknięcie pobrania obiektu do aktualizacji. –

+1

Można rozważyć użycie [ChangeObjectState] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.changeobjectstate.aspx). To powinno oznaczać cały obiekt jako zmodyfikowany. –

+0

ChangeObjectState() działało idealnie, dzięki Craig. –

0

Staraj się unikać ładowania podmiotów za pomocą Załącznika. Jeśli po prostu podmiot od DB, nie trzeba męczyć się z ustawieniami flagi na nulled przedmiotów:

var stage = Db.Stages.First(s => s.ID == someId); 
stage.Notation = vm.Notation; // can be also null 
Db.SaveChanges();