我可以在EntityFramework Core 1.0 rc2中配置拦截器吗?

在本博客文章中所示的entity framework6中,有一种方法可以配置拦截器,该拦截器可以记录所有慢速查询,包括堆栈回溯。

2015年的一个问题是关于之前称为EF7的测试版的早期测试结果,这表明在asp.net vnext早期测试版中它是不可能的 。

然而,EF Core的整个设计是可组合的,并且在这里讨论github bug跟踪器时,你可能有一种技术可以将一些低级类(如SqlServerConnection子类化,然后在那里覆盖一些方法,以获得一些你可以获得的点数。执行查询之前和之后的挂钩,如果执行了毫秒计时器值,则添加一些低级别日志记录。

这仍然是必要的,也是EF Core 1.0.0-rc2-final中的唯一技术(目前截至2016年6月)?

EF Core还没有“拦截器”或类似的生命周期钩子。 此function在此处进行跟踪: https : //github.com/aspnet/EntityFramework/issues/626 。

如果您想要的只是日志输出,则可能不需要覆盖低级组件。 许多低级EF Core组件已经生成日志记录,包括查询执行。 您可以通过调用DbContextOptionsBuilder.UseLoggerFactory(ILoggerFactory factory)将EF配置为使用自定义记录器工厂。 (有关此记录器界面的更多详细信息,请参阅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/其他/ logging.html用于执行此操作的示例。

如果您需要超出EF Core组件已经生成的额外日志记录,则需要覆盖EF Core的较低级别组件。 最好通过覆盖现有组件并通过dependency injection将此重写版本添加到EF来完成。 这样做需要为EF配置自定义服务提供程序以在内部使用。 这由DbContextOptionsBuilder.UseInternalServiceProvider(IServiceProvider services)配置。有关EF如何在内部使用服务的更多详细信息,请参阅https://docs.efproject.net/en/latest/miscellaneous/internals/services.html 。