c# - 我可以在 EntityFramework Core 中配置拦截器吗?

标签 c# visual-studio-2015 entity-framework-core

在旧的(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.htmlhttps://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/

相关文章:

c# - AjaxControlToolkit 自动完成字典

visual-studio-2015 - 是否可以在 Visual Studio 2015 社区版中导入 .publishsettings 文件?

c# - EF 7 : INSERT statement conflicted with the FOREIGN KEY SAME TABLE

c# - EF Core 2.0 TransactionScope 错误

c# - 使用 c#/php/anylanguage 检测纸上的签名点

c# - C# 中的未知功能可能只适合我

c# - 使用 HtmlAgilityPack 获取 iframe 源

c++ - 如何在 Visual Studio 中调试单行函数?

c# - 让 visual studio 2015 与带有 RIA 服务的 Silverlight 5.0 OOB 一起工作

asp.net-core - Asp.net Core 通过用户 ID 获取用户