如何找出在请求处理期间执行了多少 EF Core 查询
How to find out how many EF Core queries are executed during an request processing
我们有一个 ASP.NET Core 5.0 和 EF Core 5.0 项目。我们想要实现一个查询计数器,它会查看在 API 执行期间针对数据库执行了多少 EF Core 查询。 DbContext
使用 ASP.NET DI 和 AddScoped
方法注入控制器。
有人知道如何实现吗?也许使用 EF Core 拦截器或其他东西?
最简单的方法是使用 IDbCommandInterceptor
创建从 DbCommandInterceptor
派生的 class。它应该是线程安全的。
public class MyCommandInterceptor : DbCommandInterceptor
{
public IMyStatistics Statistics { get; }
public MyCommandInterceptor(IMyStatistics statistics)
{
Statistics = statistics ?? throw new ArgumentNullException(nameof(statistics));
}
public override DbCommand CommandCreated(CommandEndEventData eventData, DbCommand result)
{
Statistics.IncrementCommandCount();
return base.CommandCreated(eventData, result);
}
}
使用IMyStatistics
界面收集数据。实现也应该是线程安全的。
public interface IMyStatistics
{
long CommandCount { get; }
long IncrementCommandCount();
}
public class MyStatistics : IMyStatistics
{
private long _commandCount;
public long CommandCount => _commandCount;
public long IncrementCommandCount()
{
return Interlocked.Increment(ref _commandCount);
}
}
并配置您的选项:
_statistics = new MyStatistics();
optionsBuilder.AddInterceptors(new MyCommandInterceptor(_statistics));
确保 _statistics
是单独的或在正确的范围内创建的。
您可以使用Event Counters
我认为这个工具可以解决问题。
我们有一个 ASP.NET Core 5.0 和 EF Core 5.0 项目。我们想要实现一个查询计数器,它会查看在 API 执行期间针对数据库执行了多少 EF Core 查询。 DbContext
使用 ASP.NET DI 和 AddScoped
方法注入控制器。
有人知道如何实现吗?也许使用 EF Core 拦截器或其他东西?
最简单的方法是使用 IDbCommandInterceptor
创建从 DbCommandInterceptor
派生的 class。它应该是线程安全的。
public class MyCommandInterceptor : DbCommandInterceptor
{
public IMyStatistics Statistics { get; }
public MyCommandInterceptor(IMyStatistics statistics)
{
Statistics = statistics ?? throw new ArgumentNullException(nameof(statistics));
}
public override DbCommand CommandCreated(CommandEndEventData eventData, DbCommand result)
{
Statistics.IncrementCommandCount();
return base.CommandCreated(eventData, result);
}
}
使用IMyStatistics
界面收集数据。实现也应该是线程安全的。
public interface IMyStatistics
{
long CommandCount { get; }
long IncrementCommandCount();
}
public class MyStatistics : IMyStatistics
{
private long _commandCount;
public long CommandCount => _commandCount;
public long IncrementCommandCount()
{
return Interlocked.Increment(ref _commandCount);
}
}
并配置您的选项:
_statistics = new MyStatistics();
optionsBuilder.AddInterceptors(new MyCommandInterceptor(_statistics));
确保 _statistics
是单独的或在正确的范围内创建的。
您可以使用Event Counters
我认为这个工具可以解决问题。