Database.BeginTransaction против Transactions.TransactionScope

87

В чем разница между System.Transactions.TransactionScopeи EF6 Database.BeginTransaction?

Может ли кто-нибудь привести небольшой пример или просто объяснить, какой из них использовать, когда с явной разницей?

PS: В своем проекте я использую EF6. Я уже читал документацию, но это не сильно помогло. Также просмотрел примеры, но они скорее используются, SqlConnection.BeginTransactionи теперь MS представила это новое Database.BeginTransactionв EF6.

Чутье
источник

Ответы:

97

Я нашел ответ в документации Entity Framework 6:

С введением EF6 Microsoft рекомендует использовать новые методы API: Database.BeginTransaction()и Database.UseTransaction(). Хотя System.Transactions.TransactionScopeон по-прежнему очень хорошо поддерживается, большинству пользователей EF6 он больше не нужен .

Хотя Database.BeginTransaction()используется только для транзакций, связанных с базой данных System.Transactions.TransactionScope, в дополнение к этому, «простой код C #» также может быть транзакционным.

Следовательно, используйте Database.BeginTransaction()там , где когда-либо выполнялись только операции, связанные с базой данных, в транзакции в EF6, в противном случае используйте System.Transactions.TransactionScopeдля смешивания операций базы данных и кода C # вместе в транзакции.

Тем, кто все еще предпочитает этот TransactionScopeподход, рекомендуется ознакомиться с его ограничениями, особенно в облачных сценариях (облачные сценарии не поддерживают распределенные транзакции).

Дополнительную информацию можно найти здесь

Чутье
источник
11
К сожалению, вы не можете вкладывать транзакции с помощью Database.BeginTransaction, в отличие от TransactionScope.
Трийнко 04
8
Что на самом деле означает «простой код C #» быть транзакционным?
Джерард
@Gerard Я предполагаю, что это означает, что если вы выполняете операции SQL вне EF (например, с использованием ADO.NET), эти операции также будут выполняться в рамках той же транзакции.
Руди