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.
- Ręcznie Zdjąć stary wpis i dołączyć nowy jeden (choć zmienia stan podmiotu do wolnostojący nadal rzuca wyjątek)
- ręcznie zmienić wartości starego wpisu z nowymi
- 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();
Jeśli twój kontekst już śledzi obiekty, które chcesz usunąć/wstawić/zaktualizować, dlaczego nie wykonasz bezpośrednio operacji na nich? –