我们需要在我们的应用程序中添加一个新功能,以便我们的DbContext在其DbSets上执行SELECT查询,例如在调用MyDbContext.Users或MyDbContext.Students等时(User和Student继承自BaseEntity类,其中包括一个属性的IsActive),我们将能够拦截它们,检查实体是否属于这种基类型BaseEntity,并以某种方式修改查询,例如添加一个where子句来检查IsActive是否为真。我试图查看 IDbCommandInterceptor 接口,但其方法,包括可能与我相关的方法, ReaderExecuting ,拦截在数据库上执行的各种SELECT语句,而不仅仅是MyDbContext的dbsets 我怎么能以正确的方式做到这一点?
谢谢,ashilon
答案 0 :(得分:2)
在这种情况下,拦截器可能不是你想要的。它们拦截所有DbContexts的查询,您只能直接修改SQL。当你想添加一个where子句时,这太危险了,因为连接可能会弄乱一切。
如果您有一个存储库或一些基类,所有查询都会通过,请在那里进行。如果你一直在做上下文。学生。那么(...)然后你可以做一个偷偷摸摸的事情,但不完全确定这是否会起作用,但我不明白它为什么不会这样做。吨。
在DbContext类中,我会将名为Students的所有DbSet属性更改为StudentsDbSet。然后我会添加此属性来替换它:
public IQueryable<Student> Students
{
get { return StudentdsDbSet.Where(a => a.IsActive); }
}
现在,所有旧代码都会引用此属性,该属性仅强制使用IsActive记录。然后,如果你需要非活跃的学生,你可以做StudentsDbSet.Where(...),你会很高兴。