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





_dbContext.Users.Add



이부분이  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





_dbContext.Users.Update



이부분이  user 를 Users Table 에 변경 하는 코드


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


_dbContext.Users.Remove



이부분이  user 를 Users Table 에서 삭제 하는 코드

Remove 는 아무 값도 return 하지 않아 Db 상에 내용을 알 수 없다. 

Db 상에 내용을 알기 위해 Query 해보자


관련영상





댓글

이 블로그의 인기 게시물

Mediator

ASPNET 6 Web Api Basic Tutorial 1 / 2 (Swagger, SeriLog, MediatR, EntityFrameworkCore, Scrutor)

Dependency Injection Customization