본문 바로가기
Entity Framework Core

Entity Framework Core] .AsNoTracking()이란?

by Fastlane 2023. 6. 9.
728x90
반응형

기본적으로 EF Core는 모든 entity의 상태를 track한다. 이것은 메모리사용량을 높이고, 퍼포먼스를 떨어뜨린다. 특히, 다량의 데이터를 처리할때 말이다. 하지만 .AsNoTracking()을 사용하므로 EF Core의 tracking mechanism을 통과할 수 있다. 쿼리 실행속도가 빨라지고 메모리 overhead를 줄일 수 있다. 

 

.AsNoTracking()?

EF Core에서 제공하는 함수로, database에서 data를 가져올 때 entities의 상태를 tracking하지 않는다. 기본적으로 EF Core를 사용하여 entity를 가져오면, context에 위해 상태값이 track된다. 따라서, EF Core는 entity 변경사항을 계속 track하고, SaveChanges()를 호출할 때 변경사항이 database에 적용된다. 

하지만, tracking mechanism은 다량의 데이터를 처리할때 메모리 사용과, 퍼포먼스 측면에서 비용이 높다. 

 

.AsNoTracking()을 사용하므로 tracking mechanism을 우회하여, read-only로 database에서 entities를 가져온다. EF Core는 변경사항을 track하지 않으므로, SaveChanges()를 호출하여도 DB에 적용되지 않는다. 

 

using (var context = new MyDbContext())
{
    var orders = context.Orders.AsNoTracking().ToList();
    // Perform read-only operations on orders
}

Orders table로부터 orders list를 가져온다. read-only목적으로 가져오는 것이므로, track이 필요없다. 쿼리 실행속도가 빨라지고, 메모리 overhead가 줄어든다. 

 

 public abstract class RepoBase<T> : IRepoBase<T> where T : class
    {
        protected AppDbContext _context { get; set; }
        public RepoBase(AppDbContext context)
        {
            _context = context;
        }
        public IQueryable<T> FindAll() => _context.Set<T>().AsNoTracking();
        public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression) =>
            _context.Set<T>().Where(expression).AsNoTracking();
        public async Task<T> GetByPK(int id) => await _context.Set<T>().FindAsync(id);
        public void Add(T entity) => _context.Set<T>().Add(entity);
        public void AddRange(IEnumerable<T> entities) => _context.Set<T>().AddRange(entities);
        public void Update(T entity) => _context.Set<T>().Update(entity);
        public void UpdateRange(IEnumerable<T> entities) => _context.UpdateRange(entities);
        public void Remove(T entity) => _context.Set<T>().Remove(entity);
        public void RemoveRange(IEnumerable<T> entities) => _context.RemoveRange(entities);
    }

 

728x90
반응형

댓글