순서
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를 진행한다.
'Programming > .NET(Blazor Web)' 카테고리의 다른 글
[Programmin][.NET][Blazor] Pop Up창 띄우기(Modal) (0) | 2025.01.13 |
---|---|
[Programming][.NET][Blazor] Authentication 처리 (0) | 2025.01.06 |
[Programmin][.NET][Blazor] Blazor CRUD(1). DBContext 구현 (0) | 2025.01.05 |
[Programming][.NET][Blazor] razor 문법 메모장 (0) | 2025.01.03 |