Когда мое приложение запрашивает, я удаляю объект, я хочу удалить загруженный файл, который связан с этим объектом.Итак, у меня есть следующий код:
TestRequest req = _context.TestRequests
.Where(x => x.id == id)
.Include(x => x.TestRequestRuns)
.Include(x => x.TestPlanFile)
.Single();
_context.TestRequests.Remove(req);
_context.UploadedFiles.Remove(req.TestPlanFile);
_context.SaveChanges();
Этот код исключений при удалении загруженного файла.Отладка показывает, что вызов _context.TestRequests.Remove(req)
делает свойство req.TestPlanFile
null
, вызывая, таким образом, исключение (вы не можете удалить пустой загруженный файл).Это НЕ очищает свойство req.TestPlanFileId
.
Чтобы выполнить это удаление, необходимо пометить дочерние объекты для удаления, прежде чем пометить основной объект для удаления.Это также означает, что пометка элемента для удаления ДОЛЖНА будет последним, что вы сделаете с данными этих сущностей, потому что вы не сможете (по крайней мере легко) получить доступ к дочерним сущностям для дальнейшей манипуляции (не всегдаБудете ли вы удалять дочерние объекты, например, если загруженный файл используется несколькими планами тестирования).
Есть ли у кого-нибудь объяснение, почему удаление свойств происходит перед использованием SaveChanges()
?Я бы подумал, что единственная функция Remove()
заключается в том, чтобы сообщать EF, что ему нужно удалить строку при сохранении изменений, но, очевидно, он делает гораздо больше.