2015-06-25 2 views
4

Я запускаю импорт CSV в SQL-db через приложение ASP.NET MVC.EntityFramework. Удалите все строки и добавьте новые. Async

Я повторяю все строки в CSV, создавая эквивалентный объект для каждого и добавляя каждый в текущий контекст.

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

Мой вопрос, является ли это безопасно вызывать ExecuteSqlCommandAsync и не ждать результатов, прежде чем я тогда называть await db.SaveChangesAsync(); так:

db.Database.ExecuteSqlCommandAsync("delete from tblName"); 
await db.SaveChangesAsync(); 

Или я должен await удаления вызова, прежде чем сделать сохранить изменения требуют? В таком случае я могу также звонить на неасинхронные версии?

В настоящее время я не ожидаю этого, и все работает как ожидается на локальном (практически без задержки), то есть существующие данные удаляются и новые данные добавляются. Меня беспокоит, есть ли что-то еще, что я должен учитывать при развертывании решения, и веб-сервер и SQL-сервер не обязательно должны быть в одном окне.

ответ

1

По MSDN:

По умолчанию ВЕИТ всегда приобретает исключительную (X) блокировку таблицы она изменяет, и считает, что блокировка, пока транзакция не будет завершена.

Это означает, что действие сохранения будет ждать завершения действия удаления, даже если последнее запущено async. Итак, поскольку вы ждете вызова сохранения, на самом деле вы также ждете вызова на удаление.

Я думаю, что я предпочел бы ждать вызова delete явно (или не называть его async), потому что вы можете отвечать на любые возникающие ошибки (например, не выполнять действие сохранения, а записывать журнал вместо этого).

Сторона примечания: рассмотрите возможность использования TRUNCATE TABLE.

1

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

Даже если это было безопасно с EF, не было бы никакой гарантии, что удаление даже началось, когда начинается сохранение.

Ошибка обработки также отсутствует.

Я не понимаю, почему вы хотели бы это сделать. Какая польза от этого? Конечно, больше нет пропускной способности. Задержка также не уменьшается, поскольку удаление должно завершиться до начала сохранения.

Смежные вопросы