将调试信息注入实体框架查询

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

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

这使我们的DBA和开发人员能够非常快速地进行响应,并且如果我们有错误的DB调用或引入性能命中(我们每天有数十万个数据库调用,所以一个错误的查询可能会导致一些问题损伤)。

我们也想用EF做到这一点。 它不一定是SQL注释,而是某种钩子以提供与该调用一起提交的元信息。 任何想法,这是否可能?

谢谢你的建议

菲利普


事实证明,使用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());
链接地址: http://www.djcxy.com/p/77309.html

上一篇: Inject debug information into Entity Framework queries

下一篇: Open a Websocket connection from Meteor.js