Можно ли удалить ребенка из коллекции и решить проблемы с SaveChanges?

Мы используем Entity Framework Code First с отношениями внешнего ключа. Мы изучаем способы обработки удаления объектов из ICollection сущностей в нашем приложении.

Когда у нас есть сущность с дочерними отношениями, мы можем добавлять объекты непосредственно в их ICollection, используя метод Add. Теперь, когда вы используете remove, вы получаете сообщение об ошибке

System.InvalidOperationException Message = The operation не удалось: связь не может быть изменена, так как один или несколько из свойства внешнего ключа не могут быть нулевыми. Когда вносятся изменения в отношение, связанное свойство внешнего ключа устанавливается в нулевое значение. Если внешний ключ не поддерживает нулевые значения, новая связь должно быть определено, свойству внешнего ключа должно быть присвоено другое ненулевое значение, или несвязанный объект должен быть удален.

Насколько я понимаю, это связано с тем, что команда Remove для коллекции удаляет отношение только путем обнуления внешнего ключа. Мы хотели написать нашу бизнес-логику в нашей сущности и разрешить удаление.

Итак, извлеките корневой объект из его репозитория, например, Order из OrderRepository, затем вызовите какой-либо конкретный метод объекта, например. Приказ.AddOrderline(Orderline orderline)Это добавляет OrderLine к OrderLines виртуальному ICollection OrderLines

Однако мы не можем написать код вроде Order.CancelOrderline(int orderLineId), потому что удаление из ICollection вызывает ошибку при сохранении изменений.

Не похоже, чтобы этого можно было добиться, просто манипулируя коллекциями объектов. Очевидно, мы можем удалить непосредственно из Context. Однако я хотел бы сделать его частью сущности. Можем ли мы очистить определенные объекты без внешнего ключа в событии SaveChanges Entity Framework? Очевидно, нужно сообщить EF, какие сущности можно удалить, если они имеют нулевой внешний ключ.

В настоящее время мы используем шаблон репозитория, поэтому контроллер не имеет доступа к контексту. Очевидно, я мог бы использовать репозиторий OrderLine или метод удаления OrderLine в репозитории Order. Однако просто интересно, можно ли написать код на объекте без ссылок на механизм сохранения.

Мысли? Мы идем об этом все неправильно? Позволяют ли другие ORM просто удалять из дочерних коллекций?

21
задан GraemeMiller 22 February 2015 в 21:33
поделиться