当返回IQueryable时覆盖DbContext

本文关键字:覆盖 DbContext IQueryable 返回 | 更新日期: 2023-09-27 18:06:31

在我的数据库中,我所有的表有5个重复字段(CreateUser, UpdateUser, IsRemoved…)

现在,我调用DbContext通常为:

mydbEntities db = new mydbEntities();

然后当我需要调出所有的studentsclasses时我通常称它们为:

var students = db.students;
var classes = db.classes;

但是!因为我必须不带那些有列IsRemoved == true,我重写在我的应用程序的任何地方:

var students = db.students.Where(m => m.IsRemoved == false);
var classes = db.classes.Where(m => m.IsRemoved == false);

为了避免替换现有代码时的错误和错误,当脚手架创建新控制器时,以及其他开发人员忘记添加Where()时,我想知道我是否可以覆盖db.students调用,以便在内部,它总是添加Where()

这在将来也会有所帮助,所以当我调用db.students.Include(s => s.classes)时,两次IsRemoved都被考虑在内,即使学生存在,如果类已被删除,那么它将不会在列表中返回它。

当返回IQueryable时覆盖DbContext

这就是为什么我相信拥有Repository类(用于数据库访问层)总是一个好主意的原因。因此,您不必直接访问dbContext对象,而是通过抽象层,例如。StudentRepositoy。

IStudentRepository studentRepository = new StudentRepository(dbContext);
var students = studentRepository.getStudents();

在这种情况下,您只需要在getStudents()方法中添加一次Where(m => m.IsRemoved == false)

我希望你不要在你的控制器中重复这些查询(我不知道你是否使用MVC或其他一些东西)。查看本教程了解更多详细信息。

虽然,这并没有回答你的问题,我希望你考虑这些修改。

编辑:看起来确实有一种方法可以从文档

中重写dbcontext。

您是否考虑过在数据库中创建一个用于IsRemoved标志的视图?

Select * From <tablename> Where IsRemoved = 0

然后将视图添加到DBContext中。

只是一个想法。