#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), что привет к ее откату, если она приводит к ошибке. Следовательно коммитить нечего.
Комментариев нет:
Отправить комментарий