Database.ExecuteSqlCommandAsync 自动提交事务?

Database.ExecuteSqlCommandAsync autocommit transaction?

我有疑问,_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、对象[])

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

https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.database.executesqlcommandasync?view=entity-framework-6.2.0