2013-01-23 16 views
9

To, co chcę zrobić, jest proste. Mam listę części w db, i chcę usunąć/wstaw/zaktualizuj je zgodnie z listą aktualizacji.Entity Framework 5: Właściwa metoda zastąpienia wpisu w kontekście

Głównym problemem jest to, że gdy chcę zamienić wpis, nie mogę dołączyć go do kontekstu, ponieważ starszy wpis (do aktualizacji) jest już dołączony (przez poprzednie wywołanie odczytu) i zgłoszony zostanie wyjątek.

Natknąłem się na 3 myśli.

  1. Ręcznie Zdjąć stary wpis i dołączyć nowy jeden (choć zmienia stan podmiotu do wolnostojący nadal rzuca wyjątek)
  2. ręcznie zmienić wartości starego wpisu z nowymi
  3. nawiązać połączenie odczytu non Śledź sprawnie (AsNoTracking()), wydaje się to działa dobrze, ale jestem zaniepokojony wpływ na lazyloading.

Czy istnieje funkcjonalność taka jak "context.entry.replace (oldEntry, newEntry)" czy jakakolwiek inna odpowiednia metoda wykonania tej czynności?

IEnumerable<SoldPart> old = db.SoldParts.Where(sp=>sp.sessionId == sessionId); 

       var toDelete = old.Where(po=> !parts.Any(pu=>pu.id == po.id)); 
       var toCreate = parts.Where(po => !old.Any(pu => pu.id == po.id)); 
       var toUpdate = parts.Where(po => old.Any(pu => pu.id == po.id)); 


       foreach (SoldPart item in toDelete) 
       { 
        db.SoldParts.Attach(item); 
        db.SoldParts.Remove(item); 
       } 
       foreach (SoldPart item in toCreate) 
       { 
        db.SoldParts.Add(item); 
       } 

       foreach (SoldPart item in toUpdate) 
       { 

        db.SoldParts.Attach(item); 
        db.Entry(item).State = EntityState.Modified; 
       } 


       db.SaveChanges(); 
+0

Jeśli twój kontekst już śledzi obiekty, które chcesz usunąć/wstawić/zaktualizować, dlaczego nie wykonasz bezpośrednio operacji na nich? –

Odpowiedz

28

Istnieje automatyczny sposób aktualizowania wartości dołączonego obiektu z odłączonego, ale działa on tylko na skalarnych/złożonych właściwościach. Nie w usługach nawigacji:

deb.Entry(oldEntry).CurrentValues.SetValues(newEntry); 
+0

@drunkcamel: Czy możesz wyjaśnić? Podmiot musi mieć PK, w przeciwnym razie nie jest bytem. –

+0

Przykro mi, próbowałem tego i otrzymałem wyjątek, że właściwość jest częścią klucza encji i nie może zostać przypisana. Ale teraz próbowałem go odtworzyć i nie mogłem. – drunkcamel

+0

@drunkcamel: To było prawdopodobnie dlatego, że 'oldEntry' i' newEntry' miały inną wartość klucza encji. Możliwe, że się nie udało, ponieważ nie można zmienić klucza istniejącej jednostki. –

Powiązane problemy