我們在類中通常會有一個屬性為 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時實現全域性查詢篩選了。