저번시간에는 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 |