Спектральные способы очистки таблиц в EF Core - PullRequest
0 голосов
/ 02 июля 2019

Есть два основных способа, которыми я знаю, чтобы полностью очистить все записи из таблицы в EF Core.

_context.TableName.RemoveRange(_context.TableName);
_context.SaveChanges();

и

_context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");

Первый - очень медленный, так как кажется, что он перебирает набор записей и удаляет отдельные записи (группируя их в небольшие группы, но для больших наборов данных это занимает много времени). Второе требует изменения прав доступа к БД (что, хотя мое конкретное приложение имеет, похоже на ограничение), а также имеет гадость прямого SQL при взаимодействии с EF Core (которого следует избегать везде, где это возможно, чтобы гарантировать, что мы будем поддерживать слабую связь с база данных, как мы можем управлять). Эту вторую проблему можно избежать, переместив «clear» в контекст db как метод, и в этом случае, когда мы меняем поставщиков базы данных, мы можем легко обновить метод clear, но он все еще кажется мне странным.

Что из этого является лучшей практикой? Есть ли третий вариант, который мне не хватает?

1 Ответ

0 голосов
/ 02 июля 2019

Проще говоря, в EF нет «эффективного» способа очистки таблиц.Пока вы удаляете все в одной транзакции, EF будет выполнять пакетную обработку, но все равно будет выдавать запросы DELETE по одной строке за раз.

Что касается SQL, то лучше всего ставить TRUNCATE.Для этого нет команды EF, но вы можете получить доступ к базовому поставщику базы данных из своего контекста и напрямую выполнить SQL.Однако я не уверен, что это фантастическая идея сделать это как часть запроса.Возможно, вы захотите запланировать это на внешний процесс.

Кроме того, если пользователь БД, используемый вашим приложением, на самом деле имеет права на усечение, то ваша безопасность слишком мала, далеко .Использование внешнего процесса позволит вам использовать другого пользователя, который имеет привилегии и ограничит вашего веб-пользователя еще больше.Действительно, если пользователь веб-базы данных имеет больше доступа, чем SELECT, INSERT, UPDATE, DELETE (и даже DELETE сомнительно), то у вас есть потенциальная проблема безопасности.EXECUTE, если вам это нужно, должен предоставляться только для определенных sprocs и таких, которые вам нужны, а не для всей базы данных.

...