Как я могу быстро удалить все строки в таблице, используя Entity Framework?
В настоящее время я использую:
var rows = from o in dataDb.Table
select o;
foreach (var row in rows)
{
dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
Однако выполнение занимает много времени.
Есть ли альтернативы?
c#
sql
linq
entity-framework
Zhenia
источник
источник
TRUNCATE
адептов не беспокоится об ограничениях внешнего ключа.[TableName]
, он не переносим.Ответы:
Для тех, кто гуглит это и попал сюда, как я, вот как вы в настоящее время делаете это в EF5 и EF6:
Предполагая, что контекст
System.Data.Entity.DbContext
источник
[
экранирование здесь специфично для SQL Server,TRUNCATE
команда не является - она является частью ANSI SQL и поэтому будет работать на большинстве диалектов SQL (хотя и не на SQLite).Предупреждение: следующее подходит только для небольших таблиц (например, <1000 строк)
Вот решение, которое использует структуру сущностей (не SQL) для удаления строк, поэтому оно не является специфичным для SQL Engine (R / DBM).
Это предполагает, что вы делаете это для тестирования или какой-то подобной ситуации. Либо
Просто позвоните:
Предполагая этот контекст:
Для более простого кода вы можете объявить следующий метод расширения:
Тогда выше становится:
Недавно я использовал этот подход для очистки своей тестовой базы данных при каждом запуске тестового набора (это, очевидно, быстрее, чем воссоздание БД с нуля каждый раз, хотя я не проверял форму сгенерированных команд удаления).
Почему это может быть медленным?
Поэтому, если вы работаете с серьезным объемом данных, вы убьете процесс сервера SQL (он будет занимать всю память) и то же самое для процесса IIS, поскольку EF будет кэшировать все данные так же, как сервер SQL. Не используйте этот, если ваша таблица содержит серьезный объем данных.
источник
Использование команды SQL
TRUNCATE TABLE
будет самым быстрым, поскольку она работает с таблицей, а не с отдельными строками.Предполагая,
dataDb
что этоDbContext
(неObjectContext
), вы можете обернуть его и использовать метод следующим образом:источник
TRUNCATE TABLE
наDELETE FROM
источник
или
источник
Delete
наIQueryable
- я предполагаю , Manish использовал что - то вроде EntityFramework.Extended: github.com/loresoft/EntityFramework.Extended.Delete
было пользовательское расширение, и в пылу публикации ответа сначала, совершенно забыл упомянуть определение этого обычая.Delete
. :)Вы можете сделать это без Foreach
Это удалит все строки
источник
Это позволяет избежать использования любого SQL
источник
Я сталкивался с этим вопросом, когда мне приходилось иметь дело с конкретным случаем: полное обновление контента в «листовой» таблице (без ФК, указывающих на это). Это включало удаление всех строк и добавление информации о новых строках, и это должно быть сделано транзакционно (я не хочу в конечном итоге получить пустую таблицу, если вставка не удалась по какой-либо причине).
Я попробовал
public static void Clear<T>(this DbSet<T> dbSet)
подход, но новые строки не вставляются. Другим недостатком является то, что весь процесс идет медленно, так как строки удаляются одна за другой.Итак, я перешел к
TRUNCATE
подходу, так как это намного быстрее, и это также ROLLBACKable . Это также сбрасывает личность.Пример использования шаблона хранилища:
Конечно, как уже упоминалось, это решение не может быть использовано в таблицах, на которые ссылаются внешние ключи (сбой TRUNCATE).
источник
Cannot truncate table because it is being referenced by a FOREIGN KEY constraint
), даже если они пусты, поэтому FK должны быть отброшены и созданы заново для использования вTRUNCATE
любом случае.если
причины
Невозможно усечь таблицу «MyTable», так как на нее ссылается ограничение FOREIGN KEY.
Я использую это:
источник
источник
Если вы хотите очистить всю базу данных.
Из-за ограничений внешнего ключа важно, в какой последовательности таблицы обрезаются. Это способ грубой силы этой последовательности.
использование:
не забудьте восстановить ваш DbContext после этого.
источник
Следующее работает с базой данных SQLite (используя Entity Framework)
Похоже, что самый быстрый способ очистить все таблицы БД - это использовать context.Database.ExecuteSqlCommand («некоторый SQL»), как отмечалось выше в некоторых комментариях. Здесь я собираюсь показать, как сбросить счетчик 'index' таблиц тоже.
Одним из важных моментов является то, что если вы используете внешние ключи в своих таблицах, вы должны сначала удалить дочернюю таблицу перед родительской таблицей, поэтому важна последовательность (иерархия) таблиц во время удаления, в противном случае может возникнуть исключение SQLite.
Примечание: var context = new YourContext ()
источник
Это работает правильно в EF 5:
источник
В EFCore (я использую версию 3.1) вы можете использовать следующее, чтобы удалить все строки:
источник
Удалить все записи. Не сбрасывайте основной индекс, как «усекать».
источник
В моем коде у меня не было хорошего доступа к объекту Database, поэтому вы можете сделать это в DbSet, где вам также разрешено использовать любой тип sql. Это будет примерно так:
источник
Если MVC, вы можете сделать:
источник
Убедитесь, что при попытке удалить родителя все дочерние элементы будут каскадно удаляться. Или дети имеют обнуляемый внешний ключ.
источник
источник