- 实体框架教程
- 实体框架 - 首页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体框架 - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架 - DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体框架 - 代码优先方法
- 实体框架 - 模型优先方法
- 实体框架 - 数据库优先方法
- 实体框架 - 开发方法
- 实体框架 - 数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体框架 - 存储过程
- 实体框架 - 断开连接的实体
- 实体框架 - 表值函数
- 实体框架 - 原生 SQL
- 实体框架 - 枚举支持
- 实体框架 - 异步查询
- 实体框架 - 持久化
- 实体框架 - 投影查询
- 实体框架 - 命令日志记录
- 实体框架 - 命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 渴望加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体框架 - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注解
- 实体框架 - Fluent API
- 实体框架 - 种子数据库
- 实体框架 - 代码优先迁移
- 实体框架 - 多个 DbContext
- 实体框架 - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用资源
- 实体框架 - 讨论
实体框架 - 命令拦截
在 Entity Framework 6.0 中,有一个新的功能称为拦截器或拦截。拦截代码围绕拦截接口的概念构建。例如,IDbCommandInterceptor 接口定义了在 EF 调用 ExecuteNonQuery、ExecuteScalar、ExecuteReader 和相关方法之前调用的方法。
通过使用拦截,实体框架可以真正发挥其优势。使用这种方法,您可以捕获更多瞬态信息,而无需弄乱您的代码。
要实现此功能,您需要创建自己的自定义拦截器并相应地注册它。
一旦创建了实现 IDbCommandInterceptor 接口的类,就可以使用 DbInterception 类将其注册到实体框架中。
IDbCommandInterceptor 接口有六个方法,您需要实现所有这些方法。以下是这些方法的基本实现。
让我们看一下以下代码,其中实现了 IDbCommandInterceptor 接口。
public class MyCommandInterceptor : IDbCommandInterceptor { public static void Log(string comm, string message) { Console.WriteLine("Intercepted: {0}, Command Text: {1} ", comm, message); } public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { Log("NonQueryExecuted: ", command.CommandText); } public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { Log("NonQueryExecuting: ", command.CommandText); } public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { Log("ReaderExecuted: ", command.CommandText); } public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { Log("ReaderExecuting: ", command.CommandText); } public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { Log("ScalarExecuted: ", command.CommandText); } public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { Log("ScalarExecuting: ", command.CommandText); } }
注册拦截器
一旦创建了实现一个或多个拦截接口的类,就可以使用 DbInterception 类将其注册到 EF 中,如下面的代码所示。
DbInterception.Add(new MyCommandInterceptor());
还可以使用 DbConfiguration 基于代码的配置在应用程序域级别注册拦截器,如下面的代码所示。
public class MyDBConfiguration : DbConfiguration { public MyDBConfiguration() { DbInterception.Add(new MyCommandInterceptor()); } }
您还可以使用以下代码配置拦截器配置文件 -
<entityFramework> <interceptors> <interceptor type = "EFInterceptDemo.MyCommandInterceptor, EFInterceptDemo"/> </interceptors> </entityFramework>
广告