Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Выполнение SqlBulkCopy и Entity Framework в одной транзакции

#c_sharp #net #sql_server #entity_framework


Открываю транзакцию в EF вызовом:

db.Database.BeginTransaction()


делаю некоторые вещи и далее, хочу выполнить операции с большим кол-вом вставок через
BulkCopy, но таким образом, что бы если в EF или в BC будут ошибки, что бы все откатилось.

Можно ли это сделать?

Пытался скормить BC db.Database.CurrentTransaction, но не принимает...
    


Ответы

Ответ 1



Составил по примеру из Microsoft Docs. //Set up the bulk copy object inside the transaction. using (DbContextTransaction transaction = db.Database.BeginTransaction()) { using (SqlDataReader reader = commandSourceData.ExecuteReader()) { try { // Здесь можно выполнить операции с помощью EF... // <...> using (SqlBulkCopy bulkCopy = new SqlBulkCopy( destinationConnection, SqlBulkCopyOptions.KeepIdentity, transaction.UnderlyingTransaction as SqlTransaction)) { bulkCopy.BatchSize = 10; bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns"; // Write from the source to the destination. bulkCopy.WriteToServer(reader); } transaction.Commit(); } catch (Exception ex) { Console.WriteLine(ex.Message); transaction.Rollback(); } } } Ключевой момент: transaction.UnderlyingTransaction as SqlTransaction

Ответ 2



Не очень понятно, для чего вы получаете CurrentTransaction - чтобы проверить, создалась ли транзакция? Вам нужно объявить транзакцию, получить ее при открытии транзакции: public DbContextTransaction DbTransaction { set; get; } DbTransaction=db.Database.BeginTransaction(); В случае отсутствия ошибок - закоммитить ее: DbTransaction.Commit(); При наличии ошибок - откатить: DbTransaction.Rollback();

Ответ 3



ТУт уже знания SQL Server нужны. Если не ошибаюсь, Bulk должен быть атомарной операцией и накладывается как одна транзакция (можно только настраивать конфигурацию транзакции их до 6 штук в MS SQL), что привет к ее откату, если она приводит к ошибке. Следовательно коммитить нечего.

Комментариев нет:

Отправить комментарий