Я мог бы предложить исправление кода для того, что вы хотите, но есть лучшее решение: n не загружать данные, чтобы начать с .
В вашем примере кода вы загружаете данные из базы данных, а затем говорите EF удалить загруженные элементы. Это не эффективно. Не должно быть никаких причин для загрузки данных, вы должны иметь возможность просто выполнить запрос без необходимости загружать данные.
Насколько мне известно, Entity Framework не способен к "условному удалению" (из-за отсутствия лучшего имени), например:
DELETE FROM People WHERE Name = 'Bob'
Если вы хотите удалить элементы на основе определенного значения столбца (кроме идентификатора объекта), вы не можете полагаться на Entity Framework, если не хотите загружать данные (что снижает производительность).
Здесь есть два лучших варианта:
1. Выполните SQL-запрос самостоятельно
context.Database.ExecuteSqlCommand(
"DELETE FROM Products WHERE ProductGroupId = " + product.ProductGroupId
);
Так я всегда делал.
Sidenote: Я ожидаю комментариев о внедрении SQL. Для ясности: здесь нет опасности внедрения SQL-кода, поскольку product.ProductGroupId
не является строкой, а ее значение контролируется разработчиком, а не конечным пользователем.
Тем не менее, я согласен, что использование параметров SQL является хорошей практикой. Но в этом ответе я хотел предоставить простой пример, демонстрирующий, как выполнить строку, содержащую SQL.
2. Найдите библиотеку, которая позволяет удалять без загрузки.
Я только споткнулся об этом, когда гуглял только сейчас. Расширения Entity Framework * Кажется, что в 1036 * реализована функция условного удаления:
context.Customers.Where(x => x.ID == userId).DeleteFromQuery();
В вашем случае это будет:
_context.Products.Where(g => g.ProductGroupId == product.ProductGroupId).DeleteFromQuery();
Sidenote
Я всегда использовал Code First, а EF всегда генерировал каскадные удаления для меня автоматически. Поэтому, когда вы удаляете родителя, его потомки также удаляются. Я не уверен, что ваша база данных каскадно удаляет, но я предполагаю поведение EF по умолчанию (согласно моему опыту).