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

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

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

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

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

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

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

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

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

Мысли? Мы все это делаем неправильно? Другие ORM позволяют просто удалить из Child Collections?

    Я не знаю, подходит ли вам решение, но Entity Framework поддерживает идентификацию отношений . В такой связи внешний ключ дочернего объекта (зависимый) от родителя (принципала) должен быть частью (составного) первичного ключа дочернего объекта. Например – с аннотациями данных DbContext – ваши classы моделей должны выглядеть так:

     public class Order { [Key] public int OrderId { get; set; } public ICollection OrderLines { get; set; } } public class OrderLine { [Key, ForeignKey("Order"), Column(Order = 1)] public int OrderId { get; set; } [Key, Column(Order = 2)] public int OrderLineId { get; set; } public Order Order { get; set; } } 

    Вы можете сделать OrderLineId автогенерированным идентификатором, если хотите. Важно только то, что FK для Order является частью ПК.

    Код, подобный этому, например …

     using (var ctx = new MyContext()) { var order = ctx.Orders.Include("OrderLines").Single(o => o.OrderId == 1); var orderLineToDelete = order.OrderLines .FirstOrDefault(ol => ol.OrderLineId == 5); if (orderLineToDelete != null) order.OrderLines.Remove(orderLineToDelete); ctx.SaveChanges(); } 

    … действительно удалит orderLineToDelete из базы данных.

    Более подробная информация приведена в разделе « Соображения для определения и неидентификации отношений ».

    Как вы находите, если вы просто удаляете Entity из коллекции, Entity зависает в привязке к контексту объекта и выдает ошибку при вызове SaveChanges() ; Я использовал события домена, чтобы включить аккуратный способ удаления объекта из контекста объекта через repository.

    Я подробно описал этот подход в своем ответе на этот вопрос .

    Interesting Posts

    Как отсортировать вектор пар на основе второго элемента пары?

    Лучший способ объединить две карты и суммировать значения одного и того же ключа?

    Как использовать условные обозначения при замене в Notepad ++ с помощью регулярных выражений

    Как проверить, наследует ли class другой class, не создавая его?

    Как удалить конечные пробелы из расширений файлов и папок?

    Как я могу легче переключаться между буферами в Emacs?

    Стоит ли указывать указатели на NULL в деструкторе?

    Как «извлечь» несуществующий USB-накопитель с хоста Windows 7?

    Как нарисовать дерево, представляющее график подключенных узлов?

    Каков наилучший способ открыть и прочитать файл в Perl?

    Django Admin Показать изображение из Imagefield

    Определить все объекты данного classа для дальнейшей обработки

    Maven и библиотека JOGL?

    Разбирайте строку URI в коллекцию именных значений

    Visual Studio 2010 говорит, что сбой сборки без ошибок после изменения исходного файла

    Давайте будем гением компьютера.