[英]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.