如何使用实体框架 6.3 中的拦截机制



我们需要在我们的应用程序中添加一个新功能,这样对于我们的 DbContext 在其 DbSet 上执行的 SELECT 查询,例如在调用 MyDbContext.Users 或 MyDbContext.Students 等时(User 和 Student 继承自 BaseEntity 类,其中包括一个属性 IsActive(,我们将能够拦截它们,检查实体是否属于此基本类型 BaseEntity, 并以某种方式修改查询,例如添加一个 where 子句来检查 IsActive 是否为真。我试图研究 IDbCommandInterceptor 接口,但它的方法,包括可能与我相关的方法,ReaderExeting,拦截在数据库上执行的各种 SELECT 语句,而不仅仅是 MyDbContext 的数据库集。
我怎样才能以正确的方式做到这一点?

谢谢,阿西隆

在这种情况下,拦截器可能不是您想要的。 它们拦截所有 DbContext 的所有查询,您只能直接修改 SQL。 当您想要添加 where 子句时,这太危险了,因为连接可能会搞砸一切。

如果你有一个存储库或一些基类,所有查询都要经过,那就在那里做。 如果你总是在做上下文。Students.Where(...( 然后你可以做一件偷偷摸摸的事情,但不完全确定这是否有效,但我不明白为什么它不会。

在您的 DbContext 类中,我会将所有名为 Students(如 Students(的 DbSet 属性更改为 StudentsDbSet。 然后我会添加此属性来替换它:

public IQueryable<Student> Students 
{ 
    get { return StudentdsDbSet.Where(a => a.IsActive); }
}

所有旧代码现在都将引用此属性,该属性强制仅 IsActive 记录。 然后,如果你需要非活跃的学生,你可以做StudentsDbSet.Where(...(,你会很高兴。

最新更新