我有一个使用 SQL 数据库的 .net core 2.2 应用程序。我已经使用 EF Core In Memory 提供程序编写了一些单元测试来测试我的数据访问代码。我想生成 SQL 日志(基本上想知道生成的 SQL 语句。我引用了这篇文章 https://learn.microsoft.com/en-us/archive/msdn-magazine/2018/october/data-points-logging-sql-and-change-tracking-events-in-ef-core,但它不起作用(看不到任何日志)。最后我结束了类似
public class TestFixture: IDisposable
{
private static readonly LoggerFactory _loggerFactory
= new LoggerFactory(new[] {
new DebugLoggerProvider((category, level) =>
level == LogLevel.Debug)
//new ConsoleLoggerProvider ((category, level) =>
// category == DbLoggerCategory.Database.Command.Name &&
// level == LogLevel.Debug, true)
});
#region Constructor(s)
public TestFixture()
{
}
#endregion
#region Public Method(s)
public MyDbContext CreateMyDbContext()
{
var options = new
DbContextOptionsBuilder<MyDbContext>().UseInMemoryDatabase(
"MyDb")
.UseLoggerFactory(_loggerFactory)
.EnableSensitiveDataLogging()
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking).Options;
return new MyDbContext(options);
}
#endregion
现在我在 VS 输出窗口中收到大量日志,这没有帮助。看起来它们是 EF Core 内部日志,但能够识别生成的 SQL 语句。有谁知道如何在使用 EF Core In Memory 提供程序时在单元/集成测试场景中获取 EF Core 日志?
最佳答案
我刚刚开始工作。仅将我的 DbContext
派生类型和 ILoggerFactory
放在同一个 DI 容器中是不够的。但是明确地让我的上下文类型依赖于 ILoggerFactory
,然后将其传递给 UseLoggerFactory
覆盖 OnConfiguring
确实有效。
这是 .NET 6 和 EF Core 6。
public class InMemoryBasicModelContext : BasicModelContext {
private readonly ILoggerFactory lf;
public InMemoryBasicModelContext(ILoggerFactory lf)
=> this.lf = lf;
protected override void OnConfiguring(DbContextOptionsBuilder builder)
=> builder.UseInMemoryDatabase("TestInMemory")
.ConfigureWarnings(b => b.Ignore(InMemoryEventId.TransactionIgnoredWarning))
.EnableSensitiveDataLogging()
.UseLoggerFactory(lf);
}
我怀疑如果我使用的是 GenericHost
事情可能会有所不同(谁知道它的容器中到底设置了什么),但是在构建一个最小系统以了解 In Memory Provider 的使用时我想避免这种情况)。
关于xunit - 使用 EF Core In Memory 提供程序时无法在单元测试期间获取 EF Core 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60706924/