EntityFramework Core 2.0全局过滤 (HasQueryFilter) https://www.cnblogs.com/CreateMyself/p/8491058.html

没有唯一的标识,固定不变的,表示一个具体的概念,用来描述一个东西的特征,代表是什么,使用时直接添加或替换,值对象在迁移时,会以字段的形式迁移到数据库中

定义删除的接口

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

创建模型实现ISoftDelete接口

  1. public class UserInfo : IAggregationRoot, ISoftDelete
  2. {
  3. public Guid Id { get; set; }
  4. public string UserName { get; private set; }
  5. public string UserPassword { get; private set; }
  6. public string UserPhone { get; private set; }
  7. public Address Address { get; private set; }
  8. public bool IsDeleted { get; set; }
  9. }
  10. [Owned]
  11. public class Address:IValueObject
  12. {
  13. public string Province { get;private set; }
  14. public string City { get; private set; }
  15. public string County { get; private set; }
  16. public string AddressDetails { get; private set; }
  17. }

Lamda的扩展以及Code First 迁移配置

  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. //设置软删除
  4. foreach (var entityType in modelBuilder.Model.GetEntityTypes())
  5. {
  6. var parameter = Expression.Parameter(entityType.ClrType);
  7. //查询类上面是否有Owned(值对象)的特性
  8. var ownedModelType = parameter.Type;
  9. var ownedAttribute = Attribute.GetCustomAttribute(ownedModelType, typeof(OwnedAttribute));
  10. if (ownedAttribute == null)
  11. {
  12. var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
  13. var isDeletedProperty =
  14. Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));
  15. BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty,
  16. Expression.Constant(false));
  17. var lambda = Expression.Lambda(compareExpression, parameter);
  18. modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);
  19. }
  20. }
  21. }

在这里需要过滤掉值对象的类,在值对象的类上面声明一个特性,通过该特性过滤掉该值对象, 如果该类是值对象就直接跳过,不过滤值对象EF CORE会给值对象附加一个IsDeleted的字段,EF CORE执行中会报错,提示找不到该字段
Owned是EF CORE 配置值对象的特性,可以去自定义特性,在每一个值对象上面声明,在OnModelCreating 过滤掉包含这个特性的类
最终实现的代码:

  1. public async Task>> GetUserList(SearchUserDto input)
  2. {
  3. Expression> where = e => e.IsDisable == false;
  4. if (!string.IsNullOrEmpty(input.SearchName))
  5. {
  6. where = where.And(e => e.UserName.Contains(input.SearchName));
  7. }
  8.  
  9. if (!string.IsNullOrEmpty(input.SearchPwd))
  10. {
  11. where = where.And(e => e.UserPhone.Contains(input.SearchPwd));
  12. }
  13. var userList = await _userRepository.LoadEntityListAsync(where, e => e.UserName, "asc", input.PageIndex, input.Pagesize);
  14. var total = await _userRepository.GetEntitiesCountAsync(where);
  15. var userDtoList = userList.MapToList();
  16.  
  17. HeaderResult> result = new HeaderResult>
  18. {
  19. IsSucceed = true,
  20. Result = userDtoList,
  21. Total = total
  22. };
  23. return result;
  24. }

版权声明:本文为lifeng618原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lifeng618/p/10172967.html