在EntityFramework Core

时间:2017-10-05 01:02:59

标签: entity-framework-core

我正在追逐MySql / EF Core的一个问题,我随机抛出了Nested transactions are not supported的异常。当我的系统仅由一个用户使用时,不会发生此异常。但是,当我并行运行测试或有多个用户时,会发生异常。我查看了所有代码,它们无法创建嵌套事务。

到目前为止,令我害怕的唯一一段代码如下:

using (var transaction = _context.Database.BeginTransaction())
{
    // Create a few entities and add them to the EF context
    ...

    // Insert the rows: hopefully at this point, my transaction is not commited yet.
    _context.SaveChanges();

    // I then want to update a few rows with a raw sql statement without 
    // having to load the entities in memory.   
    _context.Database.ExecuteSqlCommand("UPDATE ...");

    // Now that I have inserted and inserted some data, I want to commit all these 
    // changes atomically.
    transaction.Commit();
}

这样安全吗?我保证我的SaveChanges和ExecuteSqlCommand将在同一个MySqlConnection上执行吗?我觉得当我调用SaveChanges时,它会关闭我的连接并将其放回连接池。然后,我的ExecuteSqlCommand从池中获取一个新连接(它可能是相同的一个或另一个)。所以我的初始连接(我打开事务的那个)被放回池中,它可以被另一个线程重用。

这只是一种预感,我完全不确定这是否会导致问题。

我最后的真正问题是:

  • 在事务中使用SaveChanges和ExecuteSqlCommand是否安全?

1 个答案:

答案 0 :(得分:1)

我从MySql.Data.EntityFrameworkCore / MySql.Data 6.10.1-beta升级到6.10.3-rc,看起来问题已经消失。由于问题是随机的,我不能完全确定问题确实是固定的,但到目前为止还是那么好。