Мы используем Entity Framework Code First с отношениями с внешним ключом. Мы изучаем способы обращения с удалением объектов из объектов ICollection в нашем приложении.
Когда у нас есть сущность с дочерними отношениями, мы можем добавлять объекты непосредственно к их ICollection с помощью метода Add. Теперь, когда вы используете удаление, вы получаете сообщение об ошибке
Исправлено System.InvalidOperationException Сообщение = Операция failed: отношения не могут быть изменены, поскольку один или несколько из свойства внешнего ключа не имеют значения NULL. Когда происходит изменение отношения, связанное свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, новая связь должен быть определен, для свойства внешнего ключа должно быть назначено другое ненулевое значение или не связанный с ним объект.
Я понимаю, это потому, что Remove в коллекции удаляет связь только путем обнуления внешнего ключа. Мы хотели написать нашу бизнес-логику в нашей организации и разрешить удаление.
Итак, выведите из него корневой объект Repostiory, например, Order from OrderRepository, затем вызовите некоторый конкретный метод объекта, например. Order.AddOrderline(Orderline orderline)
Это добавляет OrderLine к Заказу virtual ICollection<OrderLine> OrderLines
Однако мы не можем писать код типа Order.CancelOrderline(int orderLineId)
, потому что простое удаление из ICollection вызывает ошибку изменения сбережений.
Похоже, что этого не добиться, просто манипулируя коллекциями объектов. Очевидно, мы можем удалить непосредственно из контекста. Однако я хотел бы сделать его частью объекта. Можем ли мы очистить определенные объекты без внешнего ключа в событии SaveChanges для Entity Framework? Очевидно, необходимо указать EF, какие объекты можно удалить, если они имеют нулевой внешний ключ.
В настоящее время мы используем шаблон репозитория, поэтому у контроллера нет доступа к контексту. Очевидно, я мог использовать репозиторий OrderLine или удалить метод OrderLine в репозитории заказов. Однако просто интересно, можно ли написать код на объекте без ссылок на механизм сохранения.
Мысли? Мы все это делаем неправильно? Другие ORM позволяют просто удалить из Child Collections?