使用EF Core拦截数据库访问

时间:2016-11-10 07:21:28

标签: entity-framework-core

我正在寻找一种拦截数据库查询的方法,以此来获取更深入的性能统计数据。我经过多次查询,查询持续时间,结果数据(对于数据量级的想法)以及理想情况下对任何LINQ表达式的访问。

我可以继续扩展基础上下文类,创建另一个获取DbSet的方法,在那里返回一个包装器,但是1)看起来比它应该更糟糕,2)任何赢得的代码&#39 ; t能够区分获取缓存的结果与实际的数据库访问..

我已查看过代码并感觉要包装ExecutionStrategyFactoryDatabase是可行的方法 - 而我可以在RelationalDbContextOptionsBuilder为前者创建扩展方法或者/ replace / services,我也看不到包装的方式,这样仍然可以使用底层提供者的实现。

(另见:https://github.com/aspnet/EntityFramework/issues/6967

有没有一个好的地方可以加入这个?

1 个答案:

答案 0 :(得分:2)

对于其他人的参考:

好的,诀窍是:

  1. 通过IRelationalConnection替换EF Core的DI系统使用的ReplaceService<IRelationalConnection, MyRc>()。我们的新MyRc将现有连接包装为添加挂钩
  2. 在我们的MyRc中,有一个IDatabaseProviderServices的构造函数参数。 EF DI系统将填充它。将其转换为IRelationalDatabaseProviderServices,然后从该
  3. 获取RelationalConnection属性
  4. 包装所有方法,但让公共DbConnection DbConnection { get; }返回DbConnection的实例 - 包装类
  5. 包装类中,让CreateDbCommand()返回DbCommand的实例 - 包装类
  6. 包装类中,让ExecuteDbDataReader()返回DbDataReader的实例 - 包装类
  7. 然后,在DbCommandDbDataReader包装器中,我们可以看到正在向数据库发送哪些命令和参数,以及返回的结果。

    这仅适用于关系模型。