将调试信息注入实体框架查询
我们在我们的商店中使用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