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
반응형
'Entity Framework Core' 카테고리의 다른 글
Entity Framework Core] transactions (0) | 2023.07.14 |
---|---|
Entity Framework Core] Loading pattern (0) | 2023.07.14 |
ASP.NET Core] Entity Framework Core - Migrations (0) | 2023.05.24 |
ASP.NET Core] Entity Framework Core - database model 구성방법 (0) | 2023.05.23 |
ASP.NET Core] Entity Framework Core란? (1) | 2023.05.23 |
댓글