EFcore with Command
EF Core 를 통한 Sql 제어
1. Command (Transaction)
Add
Controller 에 다음을 추가
[ProducesResponseType(typeof(List<User>), StatusCodes.Status200OK)] [HttpPost("")] public async Task<IActionResult> CreateUser(string id, string name, string email) { if (!ModelState.IsValid) return BadRequest(ModelState); var user = new AddUser { Id = id, Name = name, Email = email }; return Ok(await _mediator.Send(user)); }
Command folder 에 AddUser.cs 파일 추가
public class AddUser:IRequest<List<User>> { public string Id { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; }
CommandHandler folder 에 AddUserHandler.cs 파일 추가
public class AddUserHandler : IRequestHandler<AddUser, List<User>> { private readonly MyDbContext _dbContext; public AddUserHandler(MyDbContext dbContext) { _dbContext = dbContext; } public async Task<List<User>> Handle(AddUser request, CancellationToken cancellationToken) { _dbContext.Users.Add(new Infrastructure.Models.User() { Id = request.Id, Name = request.Name, Email = request.Email, }); _dbContext.SaveChanges(); var users = await _dbContext.Users.Select(u => new User { Id = u.Id, Name = u.Name, Email = u.Email, }).ToListAsync(); return users; } }
실행 및 Test
이부분이 user 를 Users Table 에 추가 하는 코드
Update
Controller 에 다음을 추가
[ProducesResponseType(typeof(User), StatusCodes.Status200OK)] [HttpPut("{id}")] public async Task<IActionResult> UpdateUser([FromRoute]string id, string name, string email) { if (!ModelState.IsValid) return BadRequest(ModelState); var user = new UpdateUser { Id = id, Name = name, Email = email }; return Ok(await _mediator.Send(user)); }
Command folder 에 UpdateUser.cs 파일 추가
public class UpdateUser:IRequest<User> { public string Id { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; }
CommandHandler folder 에 UpdateUserHandler.cs 파일 추가
public class UpdateUserHandler : IRequestHandler<UpdateUser, User> { private readonly MyDbContext _dbContext; public UpdateUserHandler(MyDbContext dbContext) { _dbContext = dbContext; } public Task<User> Handle(UpdateUser request, CancellationToken cancellationToken) { var user = _dbContext.Users.Where(u => u.Id == request.Id).FirstOrDefault(); if (user == null) throw new Exception($"Can not found user, id = {request.Id}"); user.Name = request.Name; user.Email = request.Email; _dbContext.Users.Update(user); _dbContext.SaveChanges(); var updateAfterUser = _dbContext.Users.Where(u => u.Id == request.Id).FirstOrDefault(); if (updateAfterUser == null) throw new Exception($"Can not found user after savechange, id = {request.Id}"); var response = new Interface.Contract.User { Id= updateAfterUser!.Id, Email= updateAfterUser!.Email, Name= updateAfterUser!.Name, }; return Task.FromResult(response); } }
실행 및 Test
Remove
Controller 에 다음을 추가
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)] [HttpDelete("{id}")] public async Task<IActionResult> RemoveUser(string id) { if (!ModelState.IsValid) return BadRequest(ModelState); var user = new RemoveUser { Id = id}; await _mediator.Send(user); return Ok("Success"); }
Command folder 에 RemoveUser.cs 파일 추가
public class RemoveUser:IRequest { public string Id { get; set; } = string.Empty; }
CommandHandler folder 에 RemoveUserHandler.cs 파일 추가
public class RemoveUserHandler : AsyncRequestHandler<RemoveUser> { private readonly MyDbContext _dbContext; public RemoveUserHandler(MyDbContext dbContext) { _dbContext = dbContext; } protected override Task Handle(RemoveUser request, CancellationToken cancellationToken) { var user = _dbContext.Users.Where(u => u.Id == request.Id).FirstOrDefault(); if (user == null) throw new Exception($"Can not found user, id = {request.Id}"); _dbContext.Users.Remove(user); _dbContext.SaveChanges(); return Task.CompletedTask; } }
실행 및 Test
Remove 는 아무 값도 return 하지 않아 Db 상에 내용을 알 수 없다.
Db 상에 내용을 알기 위해 Query 해보자
관련영상





댓글
댓글 쓰기