Struktura Podmiotu.Remove () vs..DeleteObject()

Możesz usunąć element z bazy danych za pomocą EF za pomocą następujących dwóch metod.

Pierwszy znajduje się na EntityCollection, a drugi na ObjectContext.

Kiedy należy stosować każdy z nich?

Czy jedno jest lepsze od drugiego?

Remove() zwraca a bool i DeleteObject() zwraca void.

Author: Sam, 2013-07-18

2 answers

Ogólnie nie jest poprawne, że można" usunąć element z bazy danych " obiema metodami. Dokładnie tak jest:

  • ObjectContext.DeleteObject(entity) oznacza byt jako Deleted W kontekście. (Jest EntityState jest Deleted Potem.) Po wywołaniu SaveChanges EF wysyła do bazy danych polecenie SQL DELETE. Jeśli nie zostaną naruszone żadne ograniczenia w bazie danych, obiekt zostanie usunięty, w przeciwnym razie zostanie wyrzucony wyjątek.

  • EntityCollection.Remove(childEntity) marks relacja między rodzicem a childEntity jako Deleted. Jeśli childEntity zostanie usunięte z bazy danych i co dokładnie się stanie, gdy wywołasz SaveChanges, zależy od rodzaju relacji między nimi:

    • Jeśli relacja jest opcjonalna , tzn. klucz obcy, który odwołuje się od dziecka do rodzica w bazie danych, pozwala na wartości NULL, ta wartość zagraniczna zostanie ustawiona na null, a jeśli wywołasz SaveChanges, to ta wartość NULL dla childEntity zostanie zapisana do baza danych (tzn. związek między nimi jest usuwany). Dzieje się tak w przypadku instrukcji SQL UPDATE. Nie występuje DELETE twierdzenie.

    • Jeśli relacja jest wymagana (FK nie pozwala na wartości NULL), a relacja jest nie identyfikująca (co oznacza, że klucz obcy nie jest częścią klucza głównego dziecka (złożonego)), musisz albo dodać dziecko do innego rodzica, albo bezpośrednio usunąć dziecko (za pomocą DeleteObject then). Jeśli nie rób żadnego z tych ograniczeń, a EF rzuci wyjątek, gdy wywołasz SaveChanges - The infamous "relacja nie może zostać zmieniona, ponieważ jedna lub więcej właściwości klucza obcego nie jest nullable" wyjątek lub podobne.

    • Jeśli relacja jest identyfikująca (jest to koniecznie wymagane , to ponieważ jakakolwiek część klucza głównego nie może być NULL) EF zaznaczy childEntity jako Deleted. Jeśli zadzwonisz SaveChanges do bazy danych zostanie wysłane polecenie SQL DELETE. Jeśli nie zostaną naruszone żadne inne ograniczenia w bazie danych, obiekt zostanie usunięty, w przeciwnym razie zostanie wyrzucony wyjątek.

Jestem trochę zdezorientowany sekcją uwagi na stronie MSDN , którą podlinkowałeś, ponieważ mówi ona: "jeśli relacja ma odniesienie do ograniczenia integralności, wywołanie metody Remove na obiekcie zależnym oznacza zarówno relację, jak i relację. obiekt zależny do usunięcia.". Wydaje mi się to nieprecyzyjne, a nawet błędne, ponieważ wszystkie trzy powyższe przypadki mają "referential integrity constraint", ale tylko w ostatnim przypadku dziecko jest faktycznie usunięte. (Chyba, że mają na myśli "obiekt zależny" obiekt, który uczestniczy w identyfikującej relacji, która byłaby jednak nietypową terminologią.)

 266
Author: Slauma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:39

Jeśli naprawdę chcesz używać Deleted, musisz unieważnić swoje klucze obce, ale wtedy skończysz z osieroconymi rekordami (co jest jednym z głównych powodów, dla których nie powinieneś tego robić). Więc po prostu użyj Remove()

ObjectContext.DeleteObject (encja) oznacza encję jako usuniętą w kontekście. (Po tym jest on usuwany.) Po wywołaniu SaveChanges EF wysyła polecenie SQL DELETE do bazy danych. Jeśli nie ma ograniczeń odniesienia w baza danych jest naruszona, jednostka zostanie usunięta, w przeciwnym razie zostanie wyrzucony wyjątek.

/ align = "left" / Remove (childEntity) oznacza relację między rodzicem a dzieckiem jako usuniętą. Jeśli samo dziecko zostanie usunięte z bazy danych i co dokładnie się stanie, gdy zadzwonisz do SaveChanges, zależy od rodzaju relacji między nimi:

Warto zauważyć, że ustawienie .State = EntityState.Deleted nie powoduje automatycznie wykrytych zmian. (archiwum)

 13
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-12 20:49:04