DbTransaction和DbContextTransaction之间的区别是什么?

11
当使用dbContext.Database.BeginTransaction()方法创建的DbContextTransaction包装了EntityFramework查询时,我遇到了以下错误:

在NMemory.Transactions.Transaction.EnsureTransaction(Transaction& transaction, IDatabase database)处发生错误。在NMemory.Tables.Table2.Update(IQueryable1 query, IUpdater1 updater, Transaction transaction)处发生错误。在NMemory.Tables.Table2.NMemory.Tables.IBulkTable.Update(TableQuery1 query, Expression1 updater, Transaction transaction)处发生错误。在NMemory.Linq.QueryableEx.Update[T](IQueryable1 queryable, Expression1 updater, Transaction transaction)处发生错误。在Effort.Internal.Common.DatabaseReflectionHelper.WrapperMethods.UpdateEntities[TEntity](IQueryable1 query, Expression1 updater, Transaction transaction)处发生错误。

我在Effort GitHub存储库中找到了一篇帖子,其中有类似的错误(https://github.com/tamasflamich/effort/issues/29),它使用由dbContext.Database.Connection.BeginTransaction()方法创建的DbTransaction进行了修复。我尝试使用DbTransaction代替,它可以工作,但现在我想知道这两者之间的区别是什么?
1个回答

0
如果我们查看DbTransactionDbContextTransaction的文档,我们可以得到以下信息: DbTransaction
  • 定义了数据库事务核心行为,因此它与EntityFramework无关,来自于System.Data.Common
  • 您还可以使用一些其他方法,如CommitAsyncDisposeAsyncSaveAsync等,并实现了接口IdbTransaction
DbContextTransaction
  • 来自于System.Data.Entity
  • 仅实现了IDisposable
我在这里找到了另一个解释:https://github.com/dotnet/efcore/issues/24074 在数据库上开始一个事务是EF Core API,它将内部调用相应的低级别ADO.NET DbConnection API。建议使用DbContextTransaction,这样EF Core就可以正确地知道已经启动了一个事务 - 这可能取决于您如何使用DbContext。

请链接到英文网站。另外,一个重要的区别是DbcontextTransaction是旧版EF6的一部分。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接