정보 공유/Nuget

EntityFrameworkCore 사용법 (2/2)

Chanhongv 2024. 6. 11. 16:10

저번시간에는 Visual Studio 에서 코드 작성과 패키지 관리자 콘솔을 이용하여 Database, Table 를 생성하는 것을 소개해드렸습니다.

이번에는 코드에서 CRUD 하는 방법을 소개하겠습니다.

 

CRUD 하는 Class 를 만듭니다.

 public class EFCoreRepository<TEntity> where TEntity : class
 {
     private readonly EFCoreDbContext _context;
     private readonly DbSet<TEntity> _dbSet;

     public EFCoreRepository(EFCoreDbContext context)
     {
         _context = context;
         _dbSet = _context.Set<TEntity>();
     }

     //-- 동기 함수
     public IEnumerable<TEntity>? GetAllOrNull()
     {
         return _dbSet?.ToList();
     }

     public IEnumerable<TEntity>? GetCloneAllOrNull()
     {
         return _dbSet?.AsNoTracking().ToList();
     }

     public TEntity? GetByIdOrNull(int id)
     {
         return _dbSet?.Find(id);
     }

     public void Add(TEntity entity)
     {
         _dbSet.Add(entity);
         _context.SaveChanges();
     }

     public void Update(TEntity entity)
     {
         _dbSet.Attach(entity);
         _context.Entry(entity).State = EntityState.Modified;
         _context.SaveChanges();
     }

     public void Delete(int id)
     {
         var entity = _dbSet.Find(id);
         _dbSet.Remove(entity);
         _context.SaveChanges();
     }

     public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
     {
         return _dbSet.Where(predicate).ToList();
     }

     public IEnumerable<TEntity> GetPaged(int page, int pageSize)
     {
         return _dbSet.Skip((page - 1) * pageSize).Take(pageSize).ToList();
     }

     public IEnumerable<TEntity> ExecuteRawSql(string sql, params object[] parameters)
     {
         return _dbSet.FromSqlRaw(sql, parameters).ToList();
     }

     public void SaveChanges()
     {
         _context.SaveChanges();
     }

     //-- 비동기 함수
     public async Task<IEnumerable<TEntity>> GetAllOrNullAsync()
     {
         return await _dbSet.ToListAsync();
     }

     public async Task<IEnumerable<TEntity>> GetCloneAllOrNullAsync()
     {
         return await _dbSet.AsNoTracking().ToListAsync();
     }

     public async Task<TEntity?> GetByIdOrNullAsync(int id)
     {
         return await _dbSet.FindAsync(id);
     }

     public async Task AddAsync(TEntity entity)
     {
         await _dbSet.AddAsync(entity);
         await _context.SaveChangesAsync();
     }

     public async Task UpdateAsync(TEntity entity)
     {
         _dbSet.Attach(entity);
         _context.Entry(entity).State = EntityState.Modified;
         await _context.SaveChangesAsync();
     }

     public async Task DeleteAsync(int id)
     {
         var entity = await _dbSet.FindAsync(id);
         _dbSet.Remove(entity);
         await _context.SaveChangesAsync();
     }

     public async Task<IEnumerable<TEntity>> FindAsync(Expression<Func<TEntity, bool>> predicate)
     {
         return await _dbSet.Where(predicate).ToListAsync();
     }

     public async Task<IEnumerable<TEntity>> GetPagedAsync(int page, int pageSize)
     {
         return await _dbSet.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
     }

     public async Task<IEnumerable<TEntity>> ExecuteRawSqlAsync(string sql, params object[] parameters)
     {
         return await _dbSet.FromSqlRaw(sql, parameters).ToListAsync();
     }

     public async Task SaveChangesAsync()
     {
         await _context.SaveChangesAsync();
     }

     //-- 추가 함수
     public async Task ExecuteInTransactionAsync(Func<Task> operation)
     {
         using var transaction = await _context.Database.BeginTransactionAsync();
         try
         {
             await operation();
             await transaction.CommitAsync();
         }
         catch
         {
             await transaction.RollbackAsync();
             throw;
         }
     }
 }

 

동기, 비동기 함수를 구현하였으며 Add, Get, Update, Delete 를 사용할 수 있도록 기본 기능만을 만들었으며, 추후 필요한 기능은 추가하여 사용하면 될 것 같습니다.

 

그리고 EFCoreRepository 를 사용하는 EFCoreService 클래스도 작성 해보겠습니다.

    public class EFCoreService
    {
        public EFCoreRepository<Languages> LanguagesRepository { get; set; }

        public EFCoreService()
        {
            var context = new EFCoreDbContext();
            LanguagesRepository = new EFCoreRepository<Languages>(context);
        }
    }

 

다른 클래스에서 EFCoreService 를 이용하여 LanguagesRepository 를 이용할 수 있는 준비가 끝났습니다.

 

            // 생성
            EFCoreService service = new EFCoreService();
            service.LanguagesRepository.Add(new AT.EFCore.Entities.Languages()
            {
                Name = "Repository",
                Korean = "저장소",
                English = "Repository"
            });

			// 변경
            var findData = service.LanguagesRepository.Find(x => x.Korean == "저장소").First();
            findData.Korean = "변경테스트";

			// 저장
            service.LanguagesRepository.SaveChanges();

 

간단한 코드를 작성하였습니다.

생성 코드를 이용하여 생성된 모습

(Id 는 자동 증가)

생성

 

변경하고 저장하였을 경우 변경된 모습

변경 및 저장

 

다른 함수들도 사용해 보시길 권장드립니다.

 

EntityFrameworkCore 를 사용하면 SQL Script 를 몰라도 간단하고 편리하고 CRUD 를 가능하게 해줍니다.

속도가 느리다는 단점이 있지만 유지보수면에서는 압도적으로 유리합니다.

'정보 공유 > Nuget' 카테고리의 다른 글

EntityFrameworkCore 사용법 (1/2)  (0) 2024.06.11
log4net 사용법  (0) 2024.06.10