Entity framework 以DB First方法在调试窗口中记录所有实体框架查询
我想在调试窗口中记录实体框架查询。我可以用下面这句话:Entity framework 以DB First方法在调试窗口中记录所有实体框架查询,entity-framework,linq,logging,Entity Framework,Linq,Logging,我想在调试窗口中记录实体框架查询。我可以用下面这句话: myContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 但是,对于不同函数和不同文件中的所有查询,如何才能做到这一点呢 我必须到处写这行吗 或者有没有一种方法可以做到这一点,即编写一行特定的代码,在单个位置记录每个查询 正如所建议的,我已经在上下文的构造函数中编写了代码,但它不起作用 public partial class EkartEntities
myContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
但是,对于不同函数和不同文件中的所有查询,如何才能做到这一点呢
我必须到处写这行吗
或者有没有一种方法可以做到这一点,即编写一行特定的代码,在单个位置记录每个查询
正如所建议的,我已经在上下文的构造函数中编写了代码,但它不起作用
public partial class EkartEntities : DbContext
{
public EkartEntities() : base("name=EkartEntities")
{
Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
}
}
我做错什么了吗
而且,它不是
因为这篇文章包含了代码优先方法的答案,我们可以简单地修改我们的构造函数。我认为您最好参考使用SQL Server Profiler来捕获对数据库的所有查询 如果您在本地开发,SQL Profiler将非常适合您
探查器可以捕获任何类型的Linq查询或原始SQL查询。您可以通过向包含
DbContext
派生类的项目中添加以下类来安装全局记录器:
class MyDbConfiguration : System.Data.Entity.DbConfiguration
{
public MyDbConfiguration()
{
AddInterceptor(new System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter(
s => System.Diagnostics.Debug.WriteLine(s)));
}
}
该类表示所谓的类,在这种特殊情况下,该类用于为包含它的项目中的所有
DbContext
派生类型和实例使用指定的Action
自动注册DatabaseLogFormatter
。编写代码行后,无论在哪个函数或文件中使用此上下文,都将记录对数据库上下文的所有查询。你不必再写这行代码。可能是重复的。是的,你是对的。如果希望全局覆盖它,只需在上下文的构造函数中设置此属性即可。在这种情况下,每个实例都将进行日志记录。您可以编写一个工厂方法,创建上下文并设置记录器。然后用这个工厂方法替换所有的ctor调用。当另一个类已经有一个构造函数(生成的上下文就是这样)时,不可能用构造函数生成分部。要么代码无法编译,要么分部类不在同一命名空间中(因此实际上它是另一个不相关的类)。