저장된 엔터티 및 해당 자식 속성에서 Entity Framework를 사용하여 CreatedOn 필드를 자동으로 설정하는 방법

에서 영감을 받다

를 호출 할 때마다 databaseContext.SaveChanges()Entity Framework에서 데이터를 저장하기 전에 모든 개체와 해당 자식 클래스가 CreatedOn필드를 DateTime.Now().

세부 정보 : BaseEntity모든 엔터티가 상속 하는 클래스가 있습니다.

 public class BaseEntity
 {
        [Key]
        public virtual Guid Id{ get; set; }
        public DateTime CreatedOn { get; set; }
 }

BaseEntity위에서 상속 된 항목이 저장 될 때마다 CreatedOn속성이 할당됩니다 DateTime.Now.

다음은이를 수행하는 기본 저장소입니다.

public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : BaseEntity
{
     ....

     public virtual bool SaveChanges(TEntity entity)
     {            
         if (entity.CreatedOn == DateTime.MinValue)
             entity.CreatedOn = DateTime.Now;
         else
             entity.ModifiedOn = DateTime.Now;

         return _databaseContext.SaveChanges() > 0;           
     }
}

이것은 잘 작동하지만 문제는 객체 자체의 CreatedOn속성 업데이트 된다는 것 입니다. 모든 하위 클래스 는 업데이트 되지 않을 수 있습니다 .

SaveChanges()모든 자식 클래스를 업데이트하고 CreatedOn날짜도 설정하도록 메서드의 논리를 어떻게 변경할 수 있습니까?

이를 더 명확하게하기위한 예제를 제공하겠습니다. User아래 에있는 객체 의 인스턴스가 dbContextnew와 함께에 추가 Profile되고 새 Role클래스 인스턴스가 할당 된 다음 SaveChanges()호출 된다고 상상해보십시오 .

public class User: BaseEntity
{
        [Key]
        public virtual Guid Id { get; set; }

        public UserRole Role { get; set; }
        public ProfileDetails Profile { get; set; }
        public DateTime CreatedOn { get; set; }
        public Guid CreatedBy { get; set; }
}

CreatedOn날짜가 child user.Roleuser.Profile객체에 할당 되도록하는 가장 좋은 방법은 무엇입니까 (두 클래스 모두에서 상 속됨 BaseEntity)? 리플렉션을 사용하여 CreatedOn필드의 자식 개체 속성을 확인하려고 생각 했지만 모든 루핑이 옳지 않은 것 같습니다. 더 좋은 방법이 있습니까?

marc_s

기본적으로 SaveChanges자신의 DB 컨텍스트 클래스에서 메서드를 재정의하고 EF 변경 추적기를 사용하여 새로 만든 모든 개체를 가져온 다음 CreatedOn그에 따라 필드 를 설정해야 합니다.

이것의 라인을 따라 뭔가 :

public class DbContextBase : DbContext 
{
    public override int SaveChanges() 
    {
        DateTime currentDateTime = DateTime.Now;

        // get all the entities in the change tracker - this could be optimized
        // to fetch only the entities with "State == added" if that's the only 
        // case you want to handle
        IEnumerable<DbEntityEntry<BaseEntity>> entities = ChangeTracker.Entries<BaseEntity>();

        // handle newly added entities
        foreach (DbEntityEntry<BaseEntity> entity in entities.Where(e => (e.State == EntityState.Added)) 
        {
            // set the CreatedOn field to the current date&time
            entity.Entity.CreatedOn = currentDateTime;
        }

        // to the actual saving of the data
        return base.SaveChanges();
    }
}

물론이를 개선 할 수 있습니다.

  • 이 경우 엔터티를 처리하고 필드를 e.State == EntityState.Modified설정하십시오.ModifiedOn
  • 일반적인 문제 사례를 처리하기 위해 몇 가지 사용자 지정 예외 처리 추가
  • 훨씬 더-하늘과 당신의 상상력이 한계입니다!

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관