Почему InvalidOperationException вызывается при удалении некоторых экземпляров сущности, а UpdateException - для других - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть отношение «один ко многим», определенное для двух объектов, скажем, «Клиент» и «Заказ» Отношение гласит, что у объекта Customer может быть много объектов Order, но у Order должен быть один Customer ... довольно стандартное отношение 1: M.

У меня нет настроенных каскадных правил в базе данных, и для OnDeletes в моей модели данных сущности установлено значение Нет. Это означает, что удаление клиента, у которого есть заказы, не будет разрешено.

Моя проблема в том, что, когда пользователь в моем приложении удаляет клиента (у которого могут быть заказы), я хочу перехватить исключение, которое выдается, путем применения ограничений внешнего ключа. Для одного конкретного клиента, у которого есть 33 заказа, я получаю InvalidOperationException, но для другого клиента, у которого есть только 2 заказа, я получаю UpdateException. EF пропускает второй оператор удаления в базу данных, а база данных возвращает ошибку, для которой EF создает исключение UpdateException. В первом сценарии EF даже не позволяет оператору удаления перейти в базу данных, он просто говорит, что это будет недопустимым, поскольку этот экземпляр сущности Customer содержит Orders.

Кто-нибудь может объяснить, почему происходит такое поведение?

1 Ответ

2 голосов
/ 16 апреля 2011

Могут быть два разных исключения, потому что есть два слоя, к которым применяется эта проверка. Во-первых, если вы пометите объект как удаленный и выполните SaveChanges EF проверит его внутреннее хранилище, где отслеживаются все загруженные объекты. Если EF обнаружит, что любой отслеживаемый заказ, связанный с удаленным клиентом, также не помечен как удаленный, произойдет исключение (вероятно, InvalidOperationException). Если нет отслеживаемого связанного ордера, EF выполнит операцию удаления в базе данных, где отношение FK вызывает ошибку. Эта ошибка фиксируется EF, и исключением является throwm (вероятно, UpdateException с исключением, связанным с внутренней базой данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...