Entity Framework Core (EF Core) 包含多种机制,用于生成日志、响应事件和获取诊断。 其中每一种都针对不同的情况定制,即使多个机制可以正常工作,也请务必为手头任务选择最佳机制。 例如,数据库拦截器可用于记录 SQL,但最好由为日志记录量身定做的机制之一进行处理。 本页概述了每种机制,并描述了何时应使用每个机制。
快速参考
下表提供了此处所述的机制之间的差异的快速参考。
| 机制 | 异步 | Scope | 注册 | 预期用途 |
|---|---|---|---|---|
| 简单日志记录 | 否 | 按上下文 | 上下文配置 | 开发阶段日志记录 |
| Microsoft.Extensions.Logging | 否 | 根据上下文 | D.I. 或上下文配置 | 生产日志记录 |
| 事件 | 否 | 按上下文 | 随时 | 响应 EF 事件 |
| Interceptors | 是的 | 根据上下文 | 上下文配置 | 操控EF操作 |
| 诊断监听器 | 否 | 过程 | 全球 | 应用程序诊断 |
通常通过依赖项注入为每个应用单独配置Microsoft.Extensions.Logging。 但是,在 EF 级别,可以根据需要使用不同的记录器配置每个上下文。
简单日志记录
在配置 DbContext 实例时,可以通过使用LogTo来访问任何类型应用程序中的 EF Core 日志。 此配置通常在重写 DbContext.OnConfiguring中完成。 例如:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(Console.WriteLine);
此概念类似于 Database.Log 中的 EF6。
有关详细信息,请参阅 简单日志记录 。
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging 是一种可扩展的日志记录机制,其中包含许多常见日志记录系统的插件提供程序。 EF Core 完全集成 Microsoft.Extensions.Logging ,默认情况下,此形式的日志记录用于 ASP.NET Core 应用程序。
有关详细信息,请参阅 EF Core 中使用 Microsoft.Extensions.Logging 。
事件
EF Core 公开 .NET 事件,用于在 EF Core 代码中发生某些情况时进行回调。 事件比拦截器更简单,并且允许更灵活地进行注册。 但是,它们仅支持同步,因此无法执行非阻塞异步 I/O。
每个 DbContext 实例注册事件,可以随时完成此注册。 使用 诊断侦听器 获取相同的信息,但对于进程中的所有 DbContext 实例。
有关详细信息 ,请参阅 EF Core 中的 .NET 事件 。
拦截
EF Core 拦截器允许截获、修改和/或抑制 EF Core 操作。 这包括执行命令等低级别数据库作,以及更高级别的作,例如对 SaveChanges 的调用。
拦截器与日志记录和诊断不同,因为拦截器允许修改或抑制正在拦截的操作。 简单的日志记录 或 Microsoft.Extensions.Logging 是日志记录的更好选择。
配置上下文时,会为每个 DbContext 实例注册侦听器。 使用 诊断侦听器 获取相同的信息,但对于进程中的所有 DbContext 实例。
有关详细信息,请参阅 拦截 。
诊断侦听器
诊断侦听器允许侦听当前 .NET 进程中发生的任何 EF Core 事件。
诊断侦听器不适合从单个 DbContext 实例获取事件。 EF Core 拦截器通过对每个上下文进行注册提供对相同事件的访问权限。
诊断侦听器不用于日志记录。 简单的日志记录 或 Microsoft.Extensions.Logging 是日志记录的更好选择。
有关详细信息,请参阅 EF Core 中的“使用诊断侦听器 ”。