返回IQueryable时覆盖DbContext

时间:2015-08-06 03:14:21

标签: c# entity-framework dbcontext iqueryable

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

现在,我通常将DbContext称为:

mydbEntities db = new mydbEntities();

然后,当我需要调出所有students和所有classes时,我将其正常称为:

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

BUT!由于我不得带有列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被考虑在内,即使学生存在,如果该课程已被删除,那么它赢了& #39; t在列表中返回它。

2 个答案:

答案 0 :(得分:2)

这就是为什么我认为拥有Repository类 - 对于数据库访问层 - 总是一个好主意。所以你永远不必直接访问你的$pass = preg_replace('#[^A-Za-z0-9]#i', '', $_POST['pass']); $pass = md5($pass); $npass = preg_replace('#[^A-Za-z0-9]#i', '', $_POST['npass']); $npass2 = preg_replace('#[^A-Za-z0-9]#i', '', $_POST['npass2']); if(empty($pass)) { die(msg(0,"Type in your current password")); } elseif($pass != $current) { die(msg(0,"<div>Your current password is incorrect</div>")); } elseif(empty($npass)) { die(msg(0,"<div>Type new password</div>")); } elseif($npass < 6) { die(msg(0,"<div>Password must be at least 6 characters long</div>")); } elseif(empty($npass2)) { die(msg(0,"<div>Please repeat your new password</div>")); } elseif($npass != $npass2) { die(msg(0,"<div>Passwords doesnt match</div>")); } 对象,而是通过一个抽象层,例如。 StudentRepositoy。

dbContext

在这种情况下,您只需在IStudentRepository studentRepository = new StudentRepository(dbContext); var students = studentRepository.getStudents(); 方法中添加Where(m => m.IsRemoved == false)一次。

我希望您不要在控制器中重复这些查询(我不知道您是否正在使用MVC或其他东西)。查看this教程以获取更多详细信息。

虽然,这不能回答你的问题,但我希望你考虑这些修改。

编辑: 看起来有一种方法可以覆盖documentation

中的dbcontext

答案 1 :(得分:1)

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

Select * From <tablename> Where IsRemoved = 0

然后将视图添加到DBContext。

只是一个想法。