Gig*_*igi 29 c# entity-framework-core
在这个" .NET Core 2.0 Released! "视频结束时的3:15 ,Diego Vega展示了Entity Framework Core 2.0中的新功能演示.作为其中一部分,控制台应用程序中显示了底层SQL的转储.
我在Stack Overflow上看到很多答案,建议人们使用SQL分析器来查看底层查询.但现在我很好奇:你怎么能做Diego Vega所做的事情,并在应用程序中显示查询?
dan*_*era 47
Entity Framework Core(EF Core)简单日志记录可用于在开发和调试应用程序时轻松获取日志。这种形式的日志记录需要最少的配置,并且不需要额外的 NuGet 包。
LogTo Consoleprotected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)
LogTo debug windowprotected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(message => Debug.WriteLine(message));
Run Code Online (Sandbox Code Playgroud)
LogTo fileprivate readonly StreamWriter _logStream = new StreamWriter("mylog.txt", append: true);
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(_logStream.WriteLine);
public override void Dispose()
{
base.Dispose();
_logStream.Dispose();
}
public override async ValueTask DisposeAsync()
{
await base.DisposeAsync();
await _logStream.DisposeAsync();
}
Run Code Online (Sandbox Code Playgroud)
Moh*_*mad 36
您好,您可以执行以下操作,在输出窗口中显示Entity Framework Core生成的sql代码.在你的DbContext班上:
public static readonly Microsoft.Extensions.Logging.LoggerFactory _myLoggerFactory =
new LoggerFactory(new[] {
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider()
});
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLoggerFactory(_myLoggerFactory);
}
Run Code Online (Sandbox Code Playgroud)
只有在连接调试器时,调试记录器才会在调试输出窗口中写入消息.
您必须执行以下操作:
max*_*mus 34
我使用 EF Core 3.x,这对我有用:
services.AddDbContext<LibraryContext>(options => options
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()))
.UseSqlServer(Configuration.GetConnectionString("LibraryDemoSql")));
Run Code Online (Sandbox Code Playgroud)
信用:https : //stackoverflow.com/a/59663606/2185783
Ric*_*SFT 30
只需添加"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": "*"
}
Run Code Online (Sandbox Code Playgroud)
SQL 输出显示在命令窗口或 VS 输出窗口中。
请参阅官方文档中的 Entity Framework Core 的 SQL 日志记录。这是一个默认情况下不记录的错误,请参阅此 GitHub 问题。
Viv*_*Dev 15
如果您只寻找底层 Sql,那么dani herrera 的答案很棒。
但是从 EF Core 5(我不确定早期版本)开始,有一个名为“调试视图”的功能,我确信您会喜欢它。这并不完全是问题所要求的,但此调试视图有很多您不能忽略的有用信息。
以下是实现这一目标的几种方法。
我已经展示了短视,现在你尝试一下长视。在这里您可以找到有关上下文所持有的对象的良好信息。
另请注意,您可以在 IQueryable 对象上调用 ToQueryString() 来获取相同的查询!
queryable.ToQueryString()
Run Code Online (Sandbox Code Playgroud)
该图显示了调用保存更改之前的状态。观察调用保存更改方法后发生的情况(按 F10,然后再次观察)。
小智 13
https://docs.microsoft.com/it-it/ef/core/miscellaneous/logging
在OnConfuguring方法中,DbContext您可以设置您的记录器,登录控制台是预定义类型,只需使用此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");
Run Code Online (Sandbox Code Playgroud)
Cai*_*ard 10
对于使用EF Core 5的用户,您的查询将具有一个Query属性和一个ToQueryString()可以调用以检索查询字符串的方法。请注意,这些属性/方法仅适用于查询,而不适用于结果 - 通常没有临时查询变量,因为它们立即运行,因此最简单的方法是将形成的查询拆分并运行为两个步骤来调试它:
//before
return db.Person.Where(p => p.Name == "John").ToList();
//after; q has Query/ToQueryString()
var q = db.Person.Where(p => p.Name == "John");
return q.ToList();
Run Code Online (Sandbox Code Playgroud)

图片由Eamon Keene 的博客提供,其中还详细介绍了如何设置日志记录
我确定接受的答案有效,但我想知道如何使用 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 .Net Core 3中的 Visual Studio中记录到输出窗口
使用AddDebug写入到输出调试窗口。
services.AddDbContext<LibraryContext>(options => options
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddDebug()))
.UseSqlServer(Configuration.GetConnectionString("key")));
Run Code Online (Sandbox Code Playgroud)
如果您正在编写基于 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);
...
}
Run Code Online (Sandbox Code Playgroud)
其中,ConsoleLoggerFactory已确定早期是这样的:
private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19494 次 |
| 最近记录: |