EFCore设置全局Filter以及全局列类型

17 篇文章 0 订阅
9 篇文章 0 订阅

1、DbContext

由于自己时间关系直接贴上亲切的代码。代码也相对比较简单,比较清晰,就不做文字介绍。

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }

    public DbSet<Users> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        //optionsBuilder.UseSqlServer("Server=.;Database=EFCoreDemo;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        #region global setting column type
        var properties = modelBuilder.Model.GetEntityTypes()
                        .SelectMany(t => t.GetProperties());
        var dateTypes = properties.Where(t => t.ClrType == typeof(DateTime) || t.ClrType == typeof(DateTime?));
        var decimalTypes = properties.Where(t => t.ClrType == typeof(decimal) || t.ClrType == typeof(decimal?));

        foreach (var property in dateTypes)
        {
            property.SetColumnType("datetime");
        }

        foreach (var property in decimalTypes)
        {
            property.SetPrecision(18);
            property.SetScale(2);
        }
        #endregion

        #region global setting filter
        var methedInfo = typeof(AppDbContext)
             .GetMethod(
                 nameof(ConfigureGlobalFilters),
                 BindingFlags.Instance | BindingFlags.NonPublic
             );
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            methedInfo.MakeGenericMethod(entityType.ClrType)
                .Invoke(this, new object[] { modelBuilder, entityType });
        }
        #endregion

        #region InitData
        InitData(modelBuilder);
        #endregion
    }

    protected virtual void ConfigureGlobalFilters<TEntity>(ModelBuilder modelBuilder, IMutableEntityType mutableEntityType)
        where TEntity : class
    {
        if (mutableEntityType.BaseType == null)
        {
            var filterExpression = CreateFilterExpression<TEntity>();
            if (filterExpression != null)
            {
                modelBuilder.Entity<TEntity>().HasQueryFilter(filterExpression);
            }
        }
    }

    protected virtual Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
        where TEntity : class
    {
        Expression<Func<TEntity, bool>> expression = null;

        if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
        {
            expression = e => !EF.Property<bool>(e, "IsDeleted");
        }

        return expression;
    }

    private void InitData(ModelBuilder modelBuilder)
    {
        int userId = 1;
        modelBuilder.Entity<Users>().HasData(new[]
        {
            new Users
            {
                Id=userId++,
                Weight=65.22m,
                CreationTime=DateTime.Now
            },
            new Users
            {
                Id=userId++,
                Weight=65.22m,
                CreationTime=DateTime.Now,
                UpdatedTime=DateTime.Now,
                DeletedTime=DateTime.Now,
                IsDeleted=true
            }
        });
    }
}

2、Entity

 public class Users : ISoftDelete
 {
     public int Id { get; set; }

     public decimal Weight { get; set; }
     public DateTime CreationTime { get; set; }

     public DateTime? UpdatedTime { get; set; }

     public bool? IsDeleted { get; set; }

     public DateTime? DeletedTime { get; set; }
 }
 
 public interface ISoftDelete
 {
     public bool? IsDeleted { get; set; }

     public DateTime? DeletedTime { get; set; }
 }

3、Migration

dotnet ef migrations add Inital
dotnet ef database update

4、Testing

 public class Program
 {
     public static void Main(string[] args)
         => CreateHostBuilder(args).Build().Run();

     public static IHostBuilder CreateHostBuilder(string[] args)
         => Host.CreateDefaultBuilder(args)
             .ConfigureWebHostDefaults(
                 webBuilder => webBuilder.UseStartup<Startup>());
 }

 public class Startup
 {
     public void ConfigureServices(IServiceCollection services)
         => services.AddDbContext<AppDbContext>(options => options.UseSqlServer("Server=.;Database=EFCoreDemo;Trusted_Connection=True;"));

     public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AppDbContext context)
     {
         void TestGlobalFilter()
         {
             // testing
             var allUsers = context.Users.IgnoreQueryFilters().ToList();
             Debug.Assert(allUsers.Count == 2);

             var byFilterUsers = context.Users.ToList();
             Debug.Assert(byFilterUsers.Count == 1);
         };
         TestGlobalFilter();
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值