Entity Framework Core Tutorial 全局过滤器
介绍
Entity Framework Core 2.0引入了全局查询过滤器,可在创建模型时应用于实体。它使构建多租户应用程序和支持软删除实体变得更加容易。
- 它允许我们在模型级别指定一个过滤器,该过滤器自动应用于在指定类型的上下文中执行的所有查询。
- 这意味着实体框架会在执行LINQ查询之前自动在where子句中添加过滤器。
- 通常,全局查询过滤器应用于上下文的
OnModelCreating
方法。
这是一个简单的模型,它只包含一个实体,即Customer
public class Customer { public int CustomerId { get; set; } public string Name { get; set; } public bool IsDeleted { get; set; } }
数据库上下文构建模型时定义全局查询过滤器。因此,我们需要使用HasQueryFilter
方法在上下文类的OnModelCreating
方法中配置全局查询过滤器,并且我们可以对实体类型应用全局过滤器。
public class MyContext : DbContext { public DbSet<Customer> Customers { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=CustomerDB;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Customer>().HasQueryFilter(c => !c.IsDeleted); } }
HasQueryFilter方法中传递的表达式自动应用于Customer Type的任何LINQ查询。我们在数据库的Customers表中有四条记录。

一条记录已被软删除, IsDeleted
列包含该记录的True值。现在,如果我们使用LINQ查询从数据库中检索所有客户。
using (var context = new MyContext()) { var customers = context.Customers.ToList(); }
我们将只获得三条记录,但在数据库中,我们有四条记录,因为全局过滤器已过滤记录并仅返回IsDeleted
列包含False值的记录。
在某些情况下,我们不需要应用这些过滤器,我们也可以使用IgnoreQueryFilters()
方法禁用各个LINQ查询的过滤器。
using (var context = new MyContext()) { var customers = context.Customers .IgnoreQueryFilters().ToList(); }
现在不会应用过滤器,您将获得所有记录。