我知道这听起来像是一个非常愚蠢的问题,但我被困住了。
在Entity Framework > Entity Framework Core > Misc > Logging
页面(自2016年11月以来偶然没有更新),它会告诉您执行以下操作:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
如果我执行以下操作(将上述内容适用于ConfigureServices
方法),我确实会在每个命令运行时将SQL输出提供给控制台/调试控制台:
services.AddDbContext<MyStoreContext>(options =>
{
options.UseSqlServer(connection);
options.UseLoggerFactory(new LoggerFactory().AddConsole().AddDebug());
});
然而,UseLoggerFactory
扩展方法的文档清楚地说明了:
设置将用于创建ILoggerFactory实例的ILoggerFactory 用于由此上下文完成的日志记录永远不必调用此方法 因为EF可以自动获取或创建记录器工厂。
使用其中一个时,无需调用此方法 “AddDbContext”methods.'AddDbContext'将确保 获得EF使用的Microsoft.Extensions.Logging.ILoggerFactory 来自应用服务提供商。
所以我似乎不应该使用它,因此我认为它会自动使用我在此配置的任何内容:
services.AddLogging(options =>
{
options.AddDebug();
options.AddConsole();
}
但事实并非如此。如果我只在这里配置“全局”记录,则不向控制台输出任何内容。
在ASP.NET Core 2下登录EFCore 2的正确方法是什么?
答案 0 :(得分:1)
我正在使用带有sdk 2.1.1的.net core 2.1,并且可以通过2种不同的数据库提供程序(mysql和oracle)以这种方式工作。
我的文件appsettings.json
具有以下配置:
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Debug"
}
},
"Console": {
"LogLevel": {
"Default": "Debug"
}
}
}
}
在Program.cs中,我将其导入
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false, true)
.AddCommandLine(args)
.Build();
并在构建虚拟主机时将其传递
WebHost.CreateDefaultBuilder()
.UseConfiguration(config)
.Build();
注意:
我就像您一样将db上下文添加到DI中,但是我不需要此代码:
services.AddLogging(options =>
{
options.AddDebug();
options.AddConsole();
}