【问题标题】:Can we add a systematic WHERE clause to Entity Framework when it queries a DB table (IE Soft delete)?Entity Framework 查询数据库表(IE 软删除)时,是否可以添加系统的 WHERE 子句?
【发布时间】:2019-02-25 13:29:50
【问题描述】:

我刚刚向 MyClass SQL 表添加了 IsValidRecord 列。 它将用作逻辑删除/软删除。 现在我需要更新我的应用程序以仅根据新列查询有效记录。

我首先使用Entity Frameword DB。 我们的应用程序使用一个业务层来集中所有获取 MyClass 项目的方法。 所以我已经更新了所有使用基于 IsValid 的适当过滤器查询相关表的方法。 它工作正常。

但是,我很确定这些都是不好的做法,因为开发人员会忘记为将来添加的新方法设置此过滤器,这显然会带来不正确的记录。

我想知道 EF 是否具有使用适当的“AND IsValid = 1”过滤器自动过滤查询的功能?

我曾经在一家公司工作,与 NHibernate 做同样的事情。

我看到的 EF 唯一受支持的功能是: Soft Delete 不幸的是,它覆盖了 OnModelCreating,所以我认为它只适用于 Code First 架构。 我们首先使用 DataBase,所以我认为它不起作用,因为永远不会调用 OnModelCreating?

【问题讨论】:

  • 也许这会有所帮助:meziantou.net/2017/07/10/…(尽管这也使用了OnModelCreating
  • 此链接适用于 Entity Framework Core。我的应用程序使用 EF,我无法升级到 EF Core。是的,据我所知,OnModelCreating 不在 DB First 架构中执行。
  • 为什么不继续做您目前正在做的事情,直到您从现有数据库或 EF Core 迁移到 Code First?

标签: sql .net entity-framework soft-delete


【解决方案1】:

我通常会使用数据库中特定于应用程序的视图来实现此过滤器(毕竟,这些数据的某些用途可能需要能够看到已删除的项目)。

通过对视图的简单定义,它们应自动被 SQL 视为可更新,因此您无需编写触发器来管理 INSERT/UPDATE/DELETE 操作。然后,您就它的“表”是什么而对 Entity Framework 撒谎,而且它应该是最不明智的。

根据您希望软删除的工作方式,您可以选择在此视图中隐藏 IsValidRow 列的存在(尼特:我们在 SQL 中有行,而不是记录)并实现 INSTEAD OF DELETE 触发器在视图上允许您的应用程序通过要求 EF 删除这些行来软删除这些行。

【讨论】:

    【解决方案2】:

    我找到的最佳链接是: EDMX Mapping 使用 EDMX 设计器添加过滤条件。这基本上正是我想要的......

    这个解决方案有什么缺点吗? 乍一看,这对我来说已经足够好了。

    我能想到的唯一缺点是过滤器隐藏得很好。未来的其他开发人员可能很难弄清楚为什么/在哪里/如何过滤实体。

    【讨论】:

    • 这篇文章目前的问题是它试图成为一个答案并且试图通过询问是否有缺点来澄清这个问题。我会可能对问题进行了编辑,一旦你确定它你正在使用的方法,然后添加一个答案(它有点轻details 也可以作为一个独立的答案。The "answer" shouldn't be in another "castle")
    猜你喜欢
    • 2013-02-20
    • 2010-09-24
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多