EFCore 使用FluntApi配置 全域性查詢篩選器

柴油飛機發表於2023-11-05

我們在類中通常會有一個屬性為 IsDel來表示軟刪除或也稱邏輯刪除,這個屬性會導致我們在進行查詢操作時,每一次都要 .where(s=>s.IsDel==false) 非常的麻煩。在使用efCore時可以透過配置查詢篩選器來很好的解決這個問題。

public class SysUser
{
    public long Id { get; set; }
    public bool IsDel { get; set; } = false;
    public DateTime CreateTime { get; set; }
}

我們SysUser類中的IsDel屬性代表我們的軟刪除。

我這裡自己的DbContext類名叫MyDbContext

public class MyDbContext:DbContext

在MyDbContext中重寫OnModelCreating方法來對SysUser類進行配置查詢篩選器

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<SysUser>().HasQueryFilter(u => u.IsDel == false);
}

但是由於我們專案中會有很多的實體類所以都寫在這裡有些臃腫。
我們可以新建EntityBase資料夾或者專案(具體怎麼樣看個人習慣),我這裡就新建了資料夾。
在資料夾中新建類,實現IEntityTypeConfiguration<TEntity>介面,來對實體類進行配置

 public class SysUserEntityConfig : IEntityTypeConfiguration<SysUser>
 {
     public void Configure(EntityTypeBuilder<SysUser> builder)
     {
         builder.HasQueryFilter(u => u.IsDel == false);
     }
 }

然後在OnModelCreating方法中,透過 modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly) 方法從當前類所在的程式集中自動應用所有實現了 IEntityTypeConfiguration<TEntity> 介面的實體配置類。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}

如果不在同一個程式集,可以使用這種方法

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    var assembly = Assembly.Load("EntityConfigurations(這裡要換成自己實際的程式集)");
    modelBuilder.ApplyConfigurationsFromAssembly(assembly);
}

透過這種方式我們就可以在使用efCore時實現全域性查詢篩選了。

相關文章