Ответ 1
Как правило, не правильно, что вы можете "удалить элемент из базы данных" с помощью обоих методов. Если быть точным, это так:
-
ObjectContext.DeleteObject(entity)
помещает объект какDeleted
в контексте. (После этогоEntityState
Deleted
.) Если вы вызываетеSaveChanges
, то EF отправляет SQL-запросDELETE
в базу данных. Если никакие ссылочные ограничения в базе данных не будут нарушены, объект будет удален, в противном случае создается исключение. -
EntityCollection.Remove(childEntity)
отмечает связь между родителем иchildEntity
какDeleted
. Если самchildEntity
удаляется из базы данных, и что именно происходит, когда вы вызываетеSaveChanges
, зависит от вида отношения между двумя:-
Если отношение необязательно, то есть внешний ключ, который ссылается от дочернего на родительский элемент в базе данных, допускает значения
NULL
, этот иностранец будет иметь значение null и если вы callSaveChanges
это значениеNULL
дляchildEntity
будет записано в базу данных (т.е. связь между двумя удаленными). Это происходит с оператором SQLUPDATE
. Нет инструкцииDELETE
. -
Если отношение требуется (FK не разрешает значения
NULL
), а отношение не идентифицирует (что означает, что внешний ключ не является частью дочернего (составного) первичного ключа), вы должны либо добавить ребенка к другому родительскому элементу, либо вы должны явно удалить дочерний элемент (затемDeleteObject
). Если вы не выполняете какие-либо из этих действий, нарушение ссылок будет нарушено, и EF будет генерировать исключение, когда вы вызываетеSaveChanges
- печально известное "Отношения не могут быть изменены, поскольку один или несколько свойств внешнего ключа не является нулевым" исключение или подобное. -
Если отношение идентифицирует (обязательно требуется, то, поскольку любая часть первичного ключа не может быть
NULL
), EF отметитchildEntity
какDeleted
. Если вы вызываетеSaveChanges
, оператор SQLDELETE
будет отправлен в базу данных. Если никакие другие ссылочные ограничения в базе данных не будут нарушены, объект будет удален, в противном случае создается исключение.
-
На самом деле я немного запутался в разделе Заметки на странице MSDN, в котором вы указали: "Если отношение имеет ссылочный ограничение целостности, вызов метода Remove на зависимом объекте означает как отношение, так и зависимый объект для удаления.". Это кажется нечетким или даже неправильным для меня, потому что все три случая выше имеют "ограничение ссылочной целостности", но только в последнем случае ребенок фактически удален. (Если они не подразумевают под "зависимым объектом" объект, который участвует в идентифицирующей взаимосвязи, которая была бы необычной терминологией, хотя.)