在同一范围内混合 ExecuteSqlCommand 和 LINQ to EF 时,EF 6 不适用于事务范围

gor*_*oth 6 c# entity-framework transactionscope entity-framework-6

我正在使用EF 6.1.NET 4.6.1.

如果我TransactionScopeAsync在 dbContext 上的 using 块内创建事务范围,然后直接更新数据库中的数据dbContext.Database.ExecuteSqlCommand,然后使用同一事务范围内的查询从数据库调用相同的实体LINQ,则它将不会显示更新的数据。

例子:

using (MyDbContext dbContext = new MyDbContext())
{
    using (TransactionScope txScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
    {
        dbContext.Database.ExecuteSqlCommand("UPDATE TestTable SET TestText = 'A' WHERE ID = 1;");
        var testObject_A = (from t in dbContext.TestTable where ID == 1 select t.TestText).FirstOrDefault();
        // THIS WILL HAVE "A"

        dbContext.Database.ExecuteSqlCommand("UPDATE TestTable SET TestText = 'B' WHERE ID = 1;");
        var testObject_B = (from t in dbContext.TestTable where ID == 1 select t.TestText).FirstOrDefault();
        // THIS WILL HAVE "A" <-- It should have been a "B"

        txScope.Complete();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我更新了一些东西,TestTable它第一次就会正确显示。
一旦我查询,textOject我将看到 上的更改TestTable
但是,如果我随后运行另一个更新textOject,然后尝试在同一数据库上下文上运行 LINQ 查询,我将看不到更改。

我缺少什么?

另外,我无法使用context.Database.BeginTransaction,因为我在当前方法之外创建了父事务范围,并且我需要它们加入父事务。
BeginTransaction 不提供一种在不将现有连接从父方法传递到子方法的情况下加入来自外部调用者/父方法的事务的方法,或者我似乎找不到任何有关如何在 EF 6 中执行此操作的文章。

https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx