EFCore 使用FluntApi配置 全局查询筛选器

立山  金牌会员 | 2023-12-5 14:10:02 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 910|帖子 910|积分 2730

我们在类中通常会有一个属性为 IsDel来表示软删除或也称逻辑删除,这个属性会导致我们在进行查询操作时,每一次都要 .where(s=>s.IsDel==false) 非常的麻烦。在使用efCore时可以通过配置查询筛选器来很好的解决这个问题。
  1. public class SysUser
  2. {
  3.     public long Id { get; set; }
  4.     public bool IsDel { get; set; } = false;
  5.     public DateTime CreateTime { get; set; }
  6. }
复制代码
我们SysUser类中的IsDel属性代表我们的软删除。
我这里自己的DbContext类名叫MyDbContext
  1. public class MyDbContext:DbContext
复制代码
在MyDbContext中重写OnModelCreating方法来对SysUser类进行配置查询筛选器
  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3.     base.OnModelCreating(modelBuilder);
  4.     modelBuilder.Entity<SysUser>().HasQueryFilter(u => u.IsDel == false);
  5. }
复制代码
但是由于我们项目中会有很多的实体类所以都写在这里有些臃肿。
我们可以新建EntityBase文件夹或者项目(具体怎么样看个人习惯),我这里就新建了文件夹。
在文件夹中新建类,实现IEntityTypeConfiguration接口,来对实体类进行配置
  1. public class SysUserEntityConfig : IEntityTypeConfiguration<SysUser>
  2. {
  3.      public void Configure(EntityTypeBuilder<SysUser> builder)
  4.      {
  5.          builder.HasQueryFilter(u => u.IsDel == false);
  6.      }
  7. }
复制代码
然后在OnModelCreating方法中,通过 modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly) 方法从当前类所在的程序集中自动应用所有实现了 IEntityTypeConfiguration 接口的实体配置类。
  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3.     base.OnModelCreating(modelBuilder);
  4.     modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
  5. }
复制代码
如果不在同一个程序集,可以使用这种方法
  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3.     base.OnModelCreating(modelBuilder);
  4.     var assembly = Assembly.Load("EntityConfigurations(这里要换成自己实际的程序集)");
  5.     modelBuilder.ApplyConfigurationsFromAssembly(assembly);
  6. }
复制代码
通过这种方式我们就可以在使用efCore时实现全局查询筛选了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表