c# - 将调试信息注入(inject) Entity Framework 查询

标签 c# sql sql-server entity-framework instrumentation

我们在我们的商店中使用 Dapper 和 EF,事实证明 Dapper 在出现问题时在调试 SQL Server 中的查询方面非常有帮助。我们不只是提交原始 SQL,而是创建了一个瘦装饰器,它还添加了一些上下文信息(来源)作为 SQL 注释,比如

/* Foo.Bar.GetOrders() */ SELECT * FROM Order WHERE orderId > 123

这让我们的 DBA 和开发人员能够在我们有错误的数据库调用或引入性能影响时快速 react 并找到问题的根源(我们每天有数十万次数据库调用,所以一个错误的查询可以造成相当大的损害)。

我们也想用 EF 来做这件事。它不必是 SQL 注释,而是某种 Hook ,以便提供随调用提交的元信息。知道这是否可能吗?

谢谢你的建议

菲利普

最佳答案

事实证明,使用 EF 6 这变得非常容易。所需要的只是 IDbCommandInterceptor 的实现,它允许我使用自定义 (SQL) 注释来扩充提交的 SQL。该评论将出现在数据库日志中,从而可以从 DBA 端进行调试/跟踪。

public class DebugCommentInterceptor : IDbCommandInterceptor
{
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        command.CommandText = "/* TRACING INFORMATION GOES HERE */ " + command.CommandText;
    }

    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        command.CommandText = "/* TRACING INFORMATION GOES HERE */ " + command.CommandText;
    }

    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
    }

    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
    }

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
    }

    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
    }
}

为了让上面的拦截器运行起来,我简单地将它注册到静态 DbInterception 类:

DbInterception.Add(new DebugCommentInterceptor());

关于c# - 将调试信息注入(inject) Entity Framework 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606190/

相关文章:

sql - 日期范围内的分组/聚合

MySQL IF..ELSE 与子查询

sql-server - 无法为无法在数据库中进行身份验证的用户提供参数 PASSWORD

c# - 如果检查两者都有值并且相等,则简化

c# - 在运行时编译 C# 代码 [更新 : or Alternatives]

c# - 从 DataGridView WinForms 中删除蓝色行

c# - 如何使用链接按钮获取转发器中选择的值?

mysql - Mysql根据月份和日期搜索数据

sql - 如何将 SQL PIVOT 用于多个聚合?

sql - 如何从日期范围中选择第一个和最后一个数据