在此“.NET Core 2.0 Released!”视频结束时的3:15,Diego Vega展示了Entity Framework Core 2.0中的新功能演示。作为其中一部分,底层SQL的转储在控制台应用程序中显示。
我在Stack Overflow上看到很多答案,建议人们使用SQL分析器来查看底层查询。但现在我很好奇:你怎么能做Diego Vega所做的事情,并在应用程序中显示查询?
答案 0 :(得分:26)
嗨,您可以执行类似以下操作,以在输出窗口中显示Entity Framework Core生成的sql代码。
在您的|
类中:
DbContext
仅当连接了调试器时,调试记录器才会在调试输出窗口中写入消息。
您将必须执行以下操作:
答案 1 :(得分:20)
只需将 "Microsoft.EntityFrameworkCore.Database.Command": "Information"
添加到 appsettings.Development.json 以便它仅在开发模式下登录。您通常不希望在生产应用中记录每个查询。
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
},
"AllowedHosts": "*"
}
SQL 输出显示在命令窗口或 VS 输出窗口中。
请参阅官方文档中的 SQL Logging of Entity Framework Core。这是一个默认情况下不记录的错误,请参阅 this GitHub issue。
答案 2 :(得分:19)
我使用EF Core 3.x,这对我有用:
services.AddDbContext<LibraryContext>(options => options
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()))
.UseSqlServer(Configuration.GetConnectionString("LibraryDemoSql")));
答案 3 :(得分:8)
https://docs.microsoft.com/en-us/ef/core/miscellaneous/logging
在DbContext
的OnConfiguring方法中,您可以设置记录器,登录控制台是预定义的类型,只需使用this NuGet。请注意,对于记录器实例,使用Factory模式是最佳实践。
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");
答案 4 :(得分:5)
登录到.Net Core 3中的 Visual Studio中的输出窗口
使用AddDebug
写入输出调试窗口。
services.AddDbContext<LibraryContext>(options => options
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddDebug()))
.UseSqlServer(Configuration.GetConnectionString("key")));
答案 5 :(得分:1)
如果您要基于ASP.NET Core MVC框架编写API或应用服务,则可以像这样在Startup.cs
类中启用SQL记录
public void ConfigureServices(IServiceCollection services)
{
...
Action<DbContextOptionsBuilder> dbOptionsContextBuilder = builder =>
{
builder.UseSqlServer(Configuration.DbConnection) // Configuration.DbConnection is the db connection string
.UseLoggerFactory(ConsoleLoggerFactory); // Logs out SQL
};
services.AddDbContext<YourDatabaseContext>(dbOptionsContextBuilder);
...
}
其中ConsoleLoggerFactory
的定义如下:
private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });
答案 6 :(得分:0)
我确定接受的答案有效,但是我想知道如何使用DI来做到这一点,所以...
private readonly ILoggerFactory loggerFactory;
public MyDataContext(DbContextOptions<MyDataContext> options, ILoggerFactory loggerFactory)
: base(options)
{
this.loggerFactory = loggerFactory;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Allow null if you are using an IDesignTimeDbContextFactory
if (loggerFactory != null)
{
if (Debugger.IsAttached)
{
// Probably shouldn't log sql statements in production
optionsBuilder.UseLoggerFactory(this.loggerFactory);
}
}
}
答案 7 :(得分:0)
此处的许多答案都非常吸引人,但如果您使用的是NLog,则不会。 如果您像我一样使用NLog,则可以执行以下操作:
optionsBuilder.UseLoggerFactory(new NLogLoggerFactory());