순서
I. ICrudRepository 정의
II. MyModelRepository 구현


I. ICrudRepository 정의

 

여기서 Repository는 저장소로 DB 그 자체의 의미보단,
DB와 연결해서 Data를 실제로 추가하고, 삭제하고 변경하는 등의 동작을 가진 인터페이스를 정의한다.

using Dul.Domain.Common; // PagingResult

using System.Collections.Generic;

using System.Threading.Tasks;

namespace MyProject
{
    public interface ICrudRepositoryAsync
    {
        Task<T> AddAsync(T model); // 입력
        Task<List<T>> GetAllAsync(); // 출력
        Task<T> GetByIdAsync(int id); // 상세

        Task<bool> EditAsync(T model); // 수정
        Task<bool> DeleteAsync(int id); // 삭제
        Task<PagingResult<T>> GetAllAsync(int skip, int take);  // 페이징
    }
}

 


II. MyModelRepository 구현

 

using Dul.Domain.Common;

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;

using System;
using System.Collections.Generic;

using System.Linq;
using System.Threading.Tasks;

namespace MyProject
    public class MyModel : ICrudRepositoryAsync
    {
        private readonly MyProjectDbContext _context;
        private readonly ILogger _logger;
        
        public MyModelRepositoryAsync(MyProjectDbContext context, ILoggerFactory loggerFactory)
        {
            this._context = context;
            this._logger = loggerFactory.CreateLogger(nameof(MyModelRepositoryAsync));
        }
        
        // 1. Add
        public async Task<MyModel> AddAsync(MyModel model)
        {
            _context.Add(model); // 실제 DB에 추가하는 역할
            
            await _context.SaveChangeAsync(); // DB Update역할
            return model;
        }
        
        // 2. 전체 출력
        public async Task<List<MyModel>> GetAllAsync()
        {
            return await _context.MyModels.OrderByDescending(m => m.modelId).ToListAsync();
        }
        
        // 3. ID로 상세보기
        public async Task<MyModel> GetByIdAsync(int id)
        {
            return await _context.MyModels.SingleOrDefaultAsync(m => m.modelId == id);
        }
        
        // 4. 삭제하기
        public async Task<bool> DeleteAsync(int id)
        {
            var model = await _context.MyModel.SingleOrDefaultAsync(m => m.modelId == id);
            
            _context.Remove(model) // 실제 DB에서 삭제하는 역할
            return ( await _context.SaveChangeAsync() > 0 )
        }
        
        // 5. 변경하기 
        public async Task<bool> EditAsync(MyModel model)
        {
            // Attach, Entry는 글 하단에 설명
            _context.Customers.Attach(model);
            _context.Entry(model).State = EntityState.Modified; 
            
            return ( await _context.SaveChangeAsync() > 0 )
        }
        
        // 6. 특정 페이지만 가져오기
        public async Task<PagingResult<MyModel>> GetAllAsync(int skip, int take)
        {
            var totalCounts = await _context.MyModels.CountAsync();
            var myModels = await _context.MyModels.OrderByDescending(m => m.modelId).Skip(skip * take).Take(take).ToList();
            
            return new PagingResult<MyModel>(myMoels, totalCounts);
        }
    }
}

 

5 변경하기의 추가설명

Attach(model), Entry(model) 와 Update()의 차이는 결국 효율성에 있다.

일반적으로 Update를 실행하면 모든 Model Data의 EntityState를 EntityState.Modyfied로 변경한다.
항상 모든 Model Data를 다 건드린다.

하지만 일부만 효율적으로 접근해 변경하고자 하는 경우,
Attach(model)을 사용하면 일부만 Db Context에 연결만 하는 의미이다.
이는 context.Entry(entity).State = EntityState.Unchanged; 를 수행하는 것과 동일하다.

그 후 EntityState를 Modified로 변경시켜주며 "수동" Update를 진행한다.

+ Recent posts