为什么EF Core两次提交一项交易?

时间:2020-05-21 04:36:17

标签: c# asp.net-core .net-core transactions ef-core-3.1

我有一个非常简单的ASP.NET Core 3.1 Web API,它使用PostgreSQL。我想记录来自EF Core的每个命令和事务。朱莉·勒曼(Julie Lerman)在其专栏之一here中写了有关在EF Core中记录SQL的文章。

我遇到的问题是...好像EF Core开始 ONE 事务,但随后连续两次调用Committing transaction?但是..为什么?

这是日志:

dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20209]
      Beginning transaction with isolation level 'Unspecified'.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20200]
      Began transaction with isolation level 'ReadCommitted'.
dbug: Microsoft.EntityFrameworkCore.Database.Command[20103]
      Creating DbCommand for 'ExecuteReader'.
dbug: Microsoft.EntityFrameworkCore.Database.Command[20104]
      Created DbCommand for 'ExecuteReader' (4ms).
dbug: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[@p0='?', @p1='?', @p2='?' (DbType = DateTime), @p3='?', @p4='?' (DbType = Int32), @p5='?', @p6='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
      INSERT INTO "Users" ("BirthCity", "BirthCountry", "Birthday", "FirstName", "Height", "LastName", "Weight")
      VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)
      RETURNING "UserId";
dbug: Microsoft.EntityFrameworkCore.Database.Command[20300]
      A data reader was disposed.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20210]
      Committing transaction.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20202]
      Committing transaction.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[20204]
      Disposing transaction.

代码如下:

启动课程:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public static readonly ILoggerFactory SqlCommandAndTransactionLoggerFactory
        = LoggerFactory.Create(builder =>
    {
        builder.AddFilter((category, level) =>
            ((category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Debug)
            || category == DbLoggerCategory.Database.Transaction.Name && level == LogLevel.Debug))
            .AddConsole();
    });

    public void ConfigureServices(IServiceCollection services)
    {
        var connectionString = Configuration.GetConnectionString("TestDbContext");
        services.AddDbContext<TestDbContext>(options =>
        {
            options.UseNpgsql(connectionString)
                .UseLoggerFactory(SqlCommandAndTransactionLoggerFactory);
        });
    }
}

存储库:

    public User Add(User model)
    {
        _context.Users.Add(model);
        _context.SaveChanges();
        return model;
    }

服务:

    public UserOutput Add(UserInput input)
    {
        var model = _mapper.Map<User>(input);
        var addedModel = _userRepository.Add(model);
        var output = _mapper.Map<UserOutput>(addedModel);
        return output;
    }

控制器:

    [HttpPost]
    public IActionResult Add([FromBody] UserInput userInput)
    {
        var userOutput = _userService.Add(userInput);

        return CreatedAtRoute("GetUser", new { userId = userOutput.UserId }, userOutput);
    }

我只是创建了一个工厂,它将记录每个命令和事务。但这是令人困惑的部分:看来它开始了一次交易:

Beginning transaction with isolation level 'Unspecified'

Began transaction with isolation level 'ReadCommitted'.

...,然后两次调用Committing transaction

0 个答案:

没有答案