【问题标题】:Override DbContext when returning IQueryable返回 IQueryable 时覆盖 DbContext
【发布时间】:2015-08-06 03:14:20
【问题描述】:

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

现在,我通常将 DbContext 称为:

mydbEntities db = new mydbEntities();

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

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 都被考虑在内,即使学生存在,如果班级已被删除,那么它也不会返回在列表中。

【问题讨论】:

    标签: c# entity-framework dbcontext iqueryable


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我喜欢这个主意,不敢相信我没想到。我在我的项目中广泛使用它们。
    • 我在很多MVC项目中使用过,非常棒! :) @AndyEvans
    • 是的,我正在使用 MVC。我将不得不修改模板以使用存储库模式。我将首先查看文档,然后测试存储库模式。
    • 酷@elcool。完成测试后,请随意选择此答案或任何其他答案作为“答案”(绿色复选)
    【解决方案2】:

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

    Select * From <tablename> Where IsRemoved = 0
    

    然后将视图添加到您的 DBContext。

    只是一个想法。

    【讨论】:

    • 对我来说听起来是个聪明的主意,保持简单:D
    • 我会把一切都加倍。我会运行一个测试看看
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2011-11-10
    • 2015-07-27
    • 2010-10-17
    • 2010-11-06
    • 2014-11-21
    相关资源
    最近更新 更多