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
.
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 jakoDeleted
W kontekście. (JestEntityState
jestDeleted
Potem.) Po wywołaniuSaveChanges
EF wysyła do bazy danych polecenie SQLDELETE
. 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 achildEntity
jakoDeleted
. JeślichildEntity
zostanie usunięte z bazy danych i co dokładnie się stanie, gdy wywołaszSaveChanges
, 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łaszSaveChanges
, to ta wartośćNULL
dlachildEntity
zostanie zapisana do baza danych (tzn. związek między nimi jest usuwany). Dzieje się tak w przypadku instrukcji SQLUPDATE
. Nie występujeDELETE
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łaszSaveChanges
- 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 zaznaczychildEntity
jakoDeleted
. Jeśli zadzwoniszSaveChanges
do bazy danych zostanie wysłane polecenie SQLDELETE
. 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ą.)
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)
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