我正在寻找一种拦截数据库查询的方法,以此来获取更深入的性能统计数据。我经过多次查询,查询持续时间,结果数据(对于数据量级的想法)以及理想情况下对任何LINQ表达式的访问。
我可以继续扩展基础上下文类,创建另一个获取DbSet
的方法,在那里返回一个包装器,但是1)看起来比它应该更糟糕,2)任何赢得的代码&#39 ; t能够区分获取缓存的结果与实际的数据库访问..
我已查看过代码并感觉要包装ExecutionStrategyFactory
或Database
是可行的方法 - 而我可以在RelationalDbContextOptionsBuilder
为前者创建扩展方法或者/ replace / services,我也看不到包装的方式,这样仍然可以使用底层提供者的实现。
(另见:https://github.com/aspnet/EntityFramework/issues/6967)
有没有一个好的地方可以加入这个?
答案 0 :(得分:2)
对于其他人的参考:
好的,诀窍是:
IRelationalConnection
替换EF Core的DI系统使用的ReplaceService<IRelationalConnection, MyRc>()
。我们的新MyRc
将现有连接包装为添加挂钩MyRc
中,有一个IDatabaseProviderServices
的构造函数参数。 EF DI系统将填充它。将其转换为IRelationalDatabaseProviderServices
,然后从该RelationalConnection
属性
DbConnection DbConnection { get; }
返回DbConnection
的实例 - 包装类CreateDbCommand()
返回DbCommand
的实例 - 包装类ExecuteDbDataReader()
返回DbDataReader
的实例 - 包装类然后,在DbCommand
和DbDataReader
包装器中,我们可以看到正在向数据库发送哪些命令和参数,以及返回的结果。
这仅适用于关系模型。