在旧的(pre .net core)时代的 Entity Framework 6 如图所示 blog post有一种方法可以配置拦截器,它可以记录所有慢速查询,包括堆栈回溯。
[注意:在 3.0 版之前的 Entity Framework Core 中,这是不可能的,因此最初的问题是询问该怎么做。自提出这个问题以来,EF Core 的新选项和新版本已经发布。这个问题现在本质上是历史性的,后来添加的一些答案引用了其他较新版本的 EF Core,其中可能已重新引入拦截器,以实现与前核心时代 Entity Framework 的功能对等]
2015 年的一个关于当时称为 EF7 的早期测试版的问题表明它不是 possible yet在 asp.net vnext 早期测试版中。
然而,EF Core 的整个设计是可组合的,并且在 github 错误跟踪器上的讨论中 here一种技术可能是您将一些低级类(如 SqlServerConnection
)子类化,然后重写其中的一些方法,以获得您可以在执行查询之前和之后 Hook 的一些点,并添加一些低级记录是否执行了毫秒计时器值。
(编辑:2020 年删除了对 2015 年预发布信息的引用)
最佳答案
更新:Interception of database operations现在在 EF Core 3.0 中可用。
原答案:
EF Core 还没有“拦截器”或类似的生命周期 Hook 。此功能在此处跟踪:https://github.com/aspnet/EntityFramework/issues/626 .
如果你想要的只是日志输出,那么覆盖低级组件可能是不必要的。许多低级别的 EF Core 组件已经产生了日志记录,包括查询执行的日志记录。您可以通过调用 DbContextOptionsBuilder.UseLoggerFactory(ILoggerFactory factory)
将 EF 配置为使用自定义记录器工厂。 (有关此记录器接口(interface)的更多详细信息,请参阅 https://docs.asp.net/en/latest/fundamentals/logging.html 和 https://github.com/aspnet/Logging。)EF Core 生成一些具有明确事件 ID 的重要日志事件。 (请参阅 1.0.0-rc2 中的 Microsoft.EntityFrameworkCore.Infrastructure.CoreLoggingEventId
,对于 1.0.0 RTM 已重命名为 Microsoft.EntityFrameworkCore.Infrastructure.CoreEventId
。)请参阅https://docs.efproject.net/en/latest/miscellaneous/logging.html有关执行此操作的示例。
如果您需要在 EF Core 组件已经生成的内容之外进行额外的日志记录,您将需要覆盖 EF Core 的低级别组件。最好通过覆盖现有组件并通过依赖项注入(inject)将此覆盖版本添加到 EF 来完成。这样做需要为 EF 配置自定义服务提供程序以供内部使用。这是由 DbContextOptionsBuilder.UseInternalServiceProvider(IServiceProvider services)
配置的,参见 https://docs.efproject.net/en/latest/miscellaneous/internals/services.html有关 EF 如何在内部使用服务的更多详细信息。
关于c# - 我可以在 EntityFramework Core 中配置拦截器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37660746/