Otrzymuję ten błąd „Nie można usunąć obiektu, ponieważ nie został znaleziony w ObjectStateManager”.
Mój kod to:
protected MyEntities sqlEntities;
public virtual void Delete(TEntity entity)
{
System.Type t = typeof(TEntity);
sqlEntities.DeleteObject(entity);
sqlEntities.SaveChanges();
}
var entity = new TEntity() { PK_ID = 23 }; sqlEntities.DeleteObject(entity);
próbowałem utworzyć pozorowaną jednostkę z prawidłowo ustawioną PK, w nadziei, że Entity Framework wywoła DeleteObject w oparciu o PKOdpowiedzi:
Oznacza to, że jednostka nie jest dołączona (nie została załadowana przez tę samą instancję kontekstu). Spróbuj tego:
źródło
Tylko małe wyjaśnienie odpowiedzi Ladislava Mrnki (która powinna być odpowiedzią zaakceptowaną).
Jeśli tak jak ja, masz kod w takim formacie:
.. to co chcesz zrobić:
Być może wydaje się to oczywiste, ale początkowo nie było dla mnie jasne, że konieczne jest określenie podmiotu, do którego należy się przywiązywać, a nie tylko kontekstu .
źródło
Żeby rozpropagować wyjaśnienie Kjartan:
Miałem:
Problem polega na tym, że użyłem własnej metody (GetProject ()), aby pobrać encję (stąd użycie innego kontekstu do załadowania jednostki):
Jednym rozwiązaniem mogłoby być dołączenie załadowanej jednostki, jak twierdzi Kjartan, innym rozwiązaniem mogłoby być rozwiązanie moje, aby załadować jednostkę w tym samym kontekście:
źródło
Wiem, że to pytanie jest dość stare, ale żadne z powyższych nie zadziałało, ponieważ usuwałem rejestry z więcej niż jednej klasy / usługi, a każdy z nich tworzył własny kontekst połączenia z bazą danych.
Aby go rozwiązać, wysłałem pierwszy utworzony kontekst do pozostałych klas / usług, które mają uzyskać dostęp do bazy danych.
Na przykład,
serviceA
zamierzałem usunąć niektóre z jego rejestrów i wywołaćserviceB
iserviceC
zrobić to samo z ich rejestrami.Następnie usunąłbym moje rejestry
serviceA
i przekazał jako parametr kontekst utworzony naserviceA
toserviceB
iserviceC
.źródło
Możesz napisać ten kod:
źródło
Jeśli żadne z powyższych nie zadziałało, możesz wypróbować to rozwiązanie:
context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();
źródło
Powinieneś być pewien, że twój obiekt znajduje się na liście, z której próbujesz usunąć, powinieneś umieścić następujący warunek
jeśli masz skomplikowany warunek równości , powinieneś zastąpić metodę równości w klasie encji, aby umieścić warunek równości, aby uzyskać właściwą drogę dla metody rozszerzenia „entity.contains”
źródło
Upewnij się, że model przekazywany do funkcji Remove (Entity) jest dokładnie taki sam, jak rekord bazy danych.
Czasami można przekazać model bez niektórych pól, takich jak Id lub Data. zachowaj je w @ html.Hiddenfor jeśli wysyłasz jako formularz.
Najlepszym sposobem jest przekazanie identyfikatora i pobranie jednostki za pomocą metody Find (Id) i przekazanie jej do Remove (Entity)
Mam nadzieję, że to komuś pomoże.
źródło
Mam ten problem i go rozwiązuję. Po prostu skopiuj poniższy kod:
źródło
W moim przypadku był jeden kontekst, ale dostałem encję z opcją „AsNoTracking”
źródło