gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:41:07 25 4
gpt4 key购买 nike

我们在我们的商店中使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com