不能在事务中使用DbContext.Query

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (127)

我使用EF6来查询后端数据库。用户可以自定义临时表并从临时表中查询数据。我在用

DataTable myDataTable = myDbContext.Query(queryStatement);

得到结果,它一直很好。

现在需要在其他严重的sqlcommand中进行查询,并且需要事务。所以我有

using (DbContextTransaction tran = myDbContext.Database.BeginTransaction())
{
  try
  {
    myDbContext.ExecuteSqlCommand(.. some command..);
    ....
    DataTable result = myDbContext.Query(queryStatement);

    myDbContext.ExecuteSqlCommand(.. some other command..);
    ....
    tran.commit();
  }
  catch (Exception ex)
  {
    //error handling...
    tran.rollback();
  }
}

但是这会在执行myDbContext.Query时抛出异常

ExecuteReader requires the command to have a transaction when the connection 
assigned to the command is in a pending local transaction.  The Transaction 
property of the command has not been initialized.

当我读到这篇文章时:https//docs.microsoft.com/en-us/ef/ef6/saving/transactions 它说:

实体框架不会在事务中包装查询。

这是导致这个问题的原因吗?

如何DbContext.Query()在交易中使用?

我还能用什么?

我尝试了所有其他方法,它们都不起作用 - 因为返回数据类型无法预先预测。

提问于
用户回答回答于

可能你错过了这个部分 -

您可以直接在SqlConnection本身或DbContext上执行数据库操作。所有这些操作都在一个事务中执行。您负责提交或回滚事务以及在其上调用Dispose(),以及关闭和处理数据库连接

然后这个代码库 -

using (var conn = new SqlConnection("..."))
{
    conn.Open();

    using (var sqlTxn = 
    conn.BeginTransaction(System.Data.IsolationLevel.Snapshot))
    {
        try
        {
            var sqlCommand = new SqlCommand();
            sqlCommand.Connection = conn;
            sqlCommand.Transaction = sqlTxn;
            sqlCommand.CommandText =
                       @"UPDATE Blogs SET Rating = 5" +
                        " WHERE Name LIKE '%Entity Framework%'";
            sqlCommand.ExecuteNonQuery();

            using (var context =  
                new BloggingContext(conn, contextOwnsConnection: false))
            {
                        context.Database.UseTransaction(sqlTxn);

                        var query =  context.Posts.Where(p => p.Blog.Rating >= 5);
                        foreach (var post in query)
                        {
                            post.Title += "[Cool Blog]";
                        }
                       context.SaveChanges();
                    }

                    sqlTxn.Commit();
        }
        catch (Exception)
        {
             sqlTxn.Rollback();
        }
    }
}

特别是这一个 -

context.Database.UseTransaction(sqlTxn);

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励