繁体   English   中英

如何使用Entity Framework 6.3中的拦截机制?

[英]How to use the interception mechanism in Entity Framework 6.3?

我们需要在应用中添加新功能,例如,对于由DbContext在其DbSet上执行的SELECT查询,例如,在调用MyDbContext.Users或MyDbContext.Students等时(用户和Student继承自BaseEntity类,其中包括正确的IsActive),我们将能够拦截它们,检查该实体是否为基本类型BaseEntity,并以某种方式修改查询,例如,添加where子句以检查IsActive是否为true。 我试图研究IDbCommandInterceptor接口,但是它的方法,包括可能对我来说不重要的方法ReaderExecuting ,拦截在数据库上执行的各种SELECT语句,而不仅仅是MyDbContext的dbset的方法。
如何以正确的方式做到这一点?

谢谢,ashilon

在这种情况下,拦截器可能不是您想要的。 它们拦截所有DbContext的所有查询,并且您只能直接修改SQL。 当您要添加where子句时,这太危险了,因为联接可能会使所有内容混乱。

如果您有存储库或某个基类,则所有查询都将通过,在此进行。 如果您一直在做context.Students.Where(...),那么您可以做一个偷偷摸摸的事情,但不能完全确定这是否行得通,但我不知道为什么不行。

在您的DbContext类上,我将所有名称为DsSet的DbSet属性(例如Student)更改为StudentsDbSet。 然后,我将添加此属性以替换它:

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

现在,所有旧代码都将引用此属性,该属性仅强制IsActive记录。 然后,如果您需要不活跃的学生,则可以执行StudentsDbSet.Where(...),这样就很好了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM