C# Database.ExecuteSqlCommandAsync自动提交事务?

C# Database.ExecuteSqlCommandAsync自动提交事务?,c#,entity-framework,rawsql,C#,Entity Framework,Rawsql,我怀疑\u context.Database.ExecuteSqlCommandAsync方法是否自动提交事务 我的代码如下所示: using (DatabaseContext _db = new DatabaseContext()) { using(var _transaction = _db.Database.BeginTransaction()) { try { await _db.Database.E

我怀疑
\u context.Database.ExecuteSqlCommandAsync
方法是否自动提交事务

我的代码如下所示:

using (DatabaseContext _db = new DatabaseContext())
{
     using(var _transaction = _db.Database.BeginTransaction())
     {
          try
          {
              await _db.Database.ExecuteSqlCommandAsync(query, paramsList);
              _transaction.Commit();
          }
          catch(Exception ex)
          {
              _transaction.Rollback();
              throw;
          }
     }
}
我假设该方法不会自动提交事务,所以我决定手动提交它


是一种良好的做法?还是没有必要这样做?

否,您不需要提交ExecuteSqlCommandAsync,但由于它直接写入数据库,EF跟踪的实体可能会过时

要解决此问题,只需处置并重新生成上下文:

using (DatabaseContext _db = new DatabaseContext())
{
   await _db.Database.ExecuteSqlCommandAsync(query, paramsList);
}
using (DatabaseContext _db = new DatabaseContext())
{
   var itemsJustInserted = _db.Items.ToList(); //should have your modified items
}
不,你不需要

ExecuteSqlCommandAsync(字符串、CancellationToken、对象[])

备注 如果没有现有的本地事务,将使用新事务来执行该命令


如果事务失败也要回滚吗?是的,在using语句的末尾,EF会自动提交或回滚。老实说,我认为它会。当调用从ExecuteSqlCommandAsync返回时,尽管调用了BeginTransaction,Database.CurrentTransaction在调用后仍然为null。