对不起我的英语。
在我的应用程序中,上下文中的所有对象都有一个名为ObsoleteFlag的属性,这基本上意味着该对象是否仍应在前端使用。它是某种“软删除”标志,实际上不必删除数据。
现在我想阻止EF返回ObsoleteFlag设置为true的任何对象(1)
例如,如果我检索对象X,则无论ObsoleteFlag设置为什么,导航列表属性Y都包含Y类型的所有相关对象。
是否有一些防止EF这样做的一般方法?我不想在访问上下文的每个地方检查ObsoleteFlag属性,也不想检查可能加载的每个导航属性。
谢谢,对不起我的英语。
答案 0 :(得分:1)
两种不同的方法:
在您的存储库图层中有一个GetAllWhatever()
返回IQueryable<Whatever>
并使用Where(x => !x.Obsolete)
,并在您检索此类对象时使用此功能。
创建Create View ActiveWhatever As Select * from ActiveWhatever Where obsolete = 0
的视图并绑定到该视图而不是表格。
第一个基本上是每次检查标志,但是在一个地方这样做,所以你不必继续思考它。
第二个是相同的,但是工作被推送到数据库而不是.NET代码。如果要修改实体或添加新实体,则必须使其成为可修改的视图,但是如何完成取决于所讨论的数据库(例如,您可以使用SQL Server中的触发器,触发器或规则来执行此操作)在PostgreSQL中。)
第二个还可以包括为DELETE
设置规则或触发器来设置过时的属性而不是删除,这样就实体框架而言,正常删除会成为您的软删除之一。关注数据库。
除非你有理由反对现有的视图来帮助应用程序的实现,否则我会采用这种方法(那就是你在数据库中的重要地位是&#34;纯粹&#34;关注数据而不是其使用)。但是,如果它对一个应用程序来说很方便,那么考虑到这个&#34;过时的&#34;
的含义,它可能会带来更多便利。