C# 返回IQueryable时重写DbContext

C# 返回IQueryable时重写DbContext,c#,entity-framework,dbcontext,iqueryable,C#,Entity Framework,Dbcontext,Iqueryable,在我的数据库中,我的所有表都有5个重复字段(CreateUser、UpdateUser、IsRemoved…) 现在,我通常将DbContext称为: mydbEntities db = new mydbEntities(); 然后当我需要培养所有的学生和所有的班级时,我通常称他们为: var students = db.students; var classes = db.classes; 但是!由于我不必携带列为IsRemoved==true的内容,因此我将应用程序中的所有内容重写为:

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

现在,我通常将DbContext称为:

mydbEntities db = new mydbEntities();
然后当我需要培养所有的
学生和所有的
班级时,我通常称他们为:

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标志

Select * From <tablename> Where IsRemoved = 0
从IsRemoved=0的位置选择*
然后将视图添加到DBContext中


只是一个想法。

这就是为什么我认为为数据库访问层提供存储库类始终是一个好主意。因此,您永远不必直接访问
dbContext
对象,而是通过一个抽象层,例如StudentRepositoy

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

我希望您的控制器中不会重复这些查询(我不知道您是否正在使用MVC或其他东西)。有关更多详细信息,请查看教程

<>虽然这不回答你的问题,但我希望你考虑一下这些修改。 编辑:
看起来确实有一种方法可以从

中重写dbcontext。对我来说,这听起来是个聪明的主意,简单一点:DI将拥有双倍的一切。我会做个测试,看看我喜欢这个主意,真不敢相信我没有想到。我在我的项目中广泛使用了它们。我在许多MVC项目中使用过它们,这太棒了!:)@Yevansyes,我用的是MVC。我必须修改模板以使用存储库模式。我将首先查看文档,然后测试repository模式。cool@elcool。完成测试后,请随意选择此选项或任何其他选项作为“答案”(绿色复选框)