我可以在 Entity Framework 6 中创建全局查询过滤器吗?通过 OnModelCreating?

Ant*_*aja 5 c# asp.net-mvc entity-framework-6

我尝试进行全局查询。我知道这在 EF Core 2.0 中是可能的,但是我需要使用 EF 6 来完成。

我尝试在 EF 6 中做这样的事情:(IsDeleted 是我的 Class Cliente 中的一个属性,作为布尔值)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Client>().HasQueryFilter(x => x.IsDeleted= false);
}
Run Code Online (Sandbox Code Playgroud)

我将感谢您的帮助,谢谢!

Bth*_*hGh 4

我相信您希望在您的应用程序中实现软删除。要应用全局查询过滤器,您也可以遵循此方法。

首先,System.linq.Dynamic使用 NuGet 安装库。

然后创建一个扩展方法,例如:

public static IQueryable<T> WhereDeleted<T>(this IQueryable<T> source)
{
    return source.Where("IsDeleted== false"); 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用其他方法:

var client = db.Client.Include("whatever you need")
                      .WhereDeleted().Where(c => c.Age < 30);
Run Code Online (Sandbox Code Playgroud)

  • 我不想实现软删除,我已经完成了这些部分,我已经编写了全局查询 EF6。请在回答前阅读问题。 (3认同)
  • 使用 System.Linq.Dynamic 有什么意义,为什么不能只使用 .Where(e=&gt;!e.IsDeleted); ?答案与安东尼奥问的问题无关。他询问如何在全局范围内实现这一目标,例如 EF core 2 中的查询过滤器。 (3认同)
  • 我知道。如果您阅读了答案,您就会明白我没有向您展示如何实现软删除。我将向您展示如何根据您的问题使用扩展方法来实现全局查询过滤器。请仔细阅读答案。 (2认同)
  • 旁注:您可以将定义“IsDeleted”的接口应用于具有此属性/列的模型,而不是 System.linq.Dynamic。如果使用 Database First,您可以更新生成模型的 T4 文件,以使具有 IsDeleted 属性的类实现该接口。 (2认同)