• ef 通过反射和表达式树配置全局过滤筛选器


    1.软删除接口

    1 public interface ISoftDelete
    2     {
    3         bool IsDeleted { get; set; }
    4     }

    2.实体类实现

    1 public class TestDeleted:ISoftDelete
    2     {
    3         public int Id { get; set; }
    4 
    5         public string Name { get; set; }
    6         public bool IsDeleted { get; set; }
    7 
    8 
    9     }

    3.modelBuilder扩展类

     1 public static class CustomModelBuilderExtensions
     2     {
     3         public static void AddSoftDeleted(this ModelBuilder builder)
     4         {
     5             var entityTypes = builder.Model.GetEntityTypes().Where(e => typeof(ISoftDelete).IsAssignableFrom(e.ClrType));
     6             foreach (var entityType in entityTypes)
     7             {
     8                 var parameter = Expression.Parameter(entityType.ClrType);
     9 
    10                 var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
    11 
    12                 var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));
    13 
    14                 BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false));
    15 
    16                 var lambdaExpression = Expression.Lambda(compareExpression, parameter);
    17 
    18                 builder.Entity(entityType.ClrType).HasQueryFilter(lambdaExpression);
    19             }
    20         }
    21     }

    4.迁移数据库

    5.在OnModelCreating方法中使用全局筛选方法

    1 builder.AddSoftDeleted();

     6.综上所述,如果想要对一张表应用软删除的话,不是对实体类加IsDeleted字段再配置,而是让他直接实现ISoftDelete接口,这样配置更灵活

  • 相关阅读:
    MySQL存储过程参数【4】
    MySQL存储过程的变量【3】
    MySQL存储过程入门【2】
    MySQL存储过程简介【1】
    MySQL删除重复行的方式
    在MySQL单个表中找到重复的值
    MySQL比较两个表不同的数据
    【思维】P5743 【深基7.习8】猴子吃桃——有趣的解法,归纳推导
    对判断质数的算法的优化
    【思维】P1321 单词覆盖还原
  • 原文地址:https://www.cnblogs.com/Spinoza/p/11831205.html
Copyright © 2020-2023  润新知