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调用。当另一个类已经有一个构造函数(生成的上下文就是这样)时,不可能用构造函数生成分部。要么代码无法编译,要么分部类不在同一命名空间中(因此实际上它是另一个不相关的类)。