【问题标题】:Database.ExecuteSqlCommandAsync autocommit transaction?Database.ExecuteSqlCommandAsync 自动提交事务?
【发布时间】:2017-01-24 16:00:49
【问题描述】:

我有一个疑问,_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 返回时,尽管调用了 BeginTransaction,但调用后 Database.CurrentTransaction 为 null。

标签: c# entity-framework rawsql


【解决方案1】:

不,您不需要提交 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
}

【讨论】:

  • 如果事务失败也要回滚吗?
  • 是的,在using语句的最后,EF会自动提交或者回滚。
【解决方案2】:

不,你不需要..

ExecuteSqlCommandAsync(String, CancellationToken, Object[])

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多