我有一个非常简单的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
。