DDD Code First 마이그레이션 데이터EF CORE 소프트 삭제, 값 객체 마이그레이션 구성

3932 단어

Jeffcky 양반의 블로그에 감사 드립니다.


EntityFramework Core 2.0 글로벌 필터링(HasQueryFilter)https://www.cnblogs.com/CreateMyself/p/8491058.html

값 객체란?


유일한 표지가 없고 고정불변하며 하나의 구체적인 개념을 나타낸다. 한 물건의 특징을 묘사하고 무엇을 대표하는지 설명할 때 직접 추가하거나 교체한다. 값 대상은 이동할 때 필드의 형식으로 데이터베이스로 이동한다.

소프트 삭제


삭제된 인터페이스 정의
         public interface ISoftDelete
         {
            bool IsDeleted { get; set; }
         }
     

ISoftDelete 인터페이스를 위한 모델 만들기
       public class UserInfo : IAggregationRoot, ISoftDelete
        {       
          public Guid Id { get; set; }
          public string UserName { get; private set; }
          public string UserPassword { get; private set; }
          public string UserPhone { get; private set; }
          public Address Address { get; private set; }
          public bool IsDeleted { get; set; }
        }
        [Owned]
        public class Address:IValueObject
        { 
          public string Province { get;private set; }
          public string City { get; private set; }
          public string County { get; private set; }
          public string AddressDetails { get; private set; }    
        }
     

Lamda의 확장 및 Code First 마이그레이션 구성
    protected override void OnModelCreating(ModelBuilder modelBuilder)
        {          
            // 
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {               
                var parameter = Expression.Parameter(entityType.ClrType);
                // Owned( ) 
                var ownedModelType = parameter.Type;
                var ownedAttribute = Attribute.GetCustomAttribute(ownedModelType, typeof(OwnedAttribute));
                if (ownedAttribute == null)
                {
                    var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
                    var isDeletedProperty =
                        Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));
                    BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty,
                        Expression.Constant(false));
                    var lambda = Expression.Lambda(compareExpression, parameter);
                    modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);
                }      
            }
        }
     

여기서 값 대상의 클래스를 필터해야 합니다. 값 대상의 클래스 위에 하나의 특성을 설명합니다. 이 특성을 통해 값 대상을 필터하면 이 클래스가 값 대상이면 바로 건너뜁니다. 그러나 값 대상인 EF CORE는 값 대상에 IsDeleted 필드를 추가합니다. EF CORE 실행 중 오류가 발생하고 이 필드를 찾을 수 없습니다. Owned는 EF CORE 설정 값 대상의 특성입니다. 사용자 정의 특성을 설정할 수 있습니다. 각 값 대상에서 설명할 수 있습니다.OnModelCreating에서 이 특성을 포함하는 클래스의 최종 구현 코드를 필터링합니다.
         public async Task
   
    
     
      >> GetUserList(SearchUserDto input)
         {
            Expression
      
       
        > where = e => e.IsDisable == false;
            if (!string.IsNullOrEmpty(input.SearchName))
            {
                where = where.And(e => e.UserName.Contains(input.SearchName));
            }

            if (!string.IsNullOrEmpty(input.SearchPwd))
            {
                where = where.And(e => e.UserPhone.Contains(input.SearchPwd));
            }
         
            var userList = await _userRepository.LoadEntityListAsync(where, e => e.UserName, "asc", input.PageIndex, input.Pagesize);
            var total = await _userRepository.GetEntitiesCountAsync(where);
            var userDtoList = userList.MapToList
        
         (); HeaderResult
         
          
           > result = new HeaderResult
           
            
             > { IsSucceed = true, Result = userDtoList, Total = total }; return result; } 
            
           
          
         
        
       
      
     
    
   

좋은 웹페이지 즐겨찾기