image

Olá pessoal, meu nome é Mauricio Junior e hoje eu vou falar e mostrar como utilizar o AsNoTracking. Para você que não sabe o que é ou nunca utilizou o AsNoTracking eu vou explicar um pouco sobre isso.

Utilizado:

  • Ferramenta: Visual Studio ou Rider
  • Linguagem de programação: C#
  • Database framework: Entity Framework (EF)

Quando você utiliza o Entity Framework e precisa fazer um select específico e logo depois fazer um update ou atualizar a informação do database, normalmente vai voltar um erro ao tentar autalizar os dados, isso porque estou tentando selecionar e com o mesmo objeto tentando atualizar. Principalmente quando o seu select não utiliza a chave da tabela para a pesquisa.

O código 1.1 mostra um simples select.

Código 1.1 - Select simples

public UserModel GetUserById(int userId)
{
    try
    {
        return _db.UserModels.FirstOrDefault(x => x.UserId == userId);
    }
    catch (Exception ex)
    {
        _logger.LogError(
            $"Method: {MethodBase.GetCurrentMethod().Name} - Exception: {ex.Message} - {DateTime.Now}");
        throw;
    }
}

Esse meu select do código 1.1 é bem simples, ele pega o primeiro registro dentro da tabela de usuário onde a campo UserId é igual ao valor passado, mas essa não é a chave da tabela.

Logo depois desse select eu preciso fazer um update, ou seja, preciso atualizar as informações usando a mesma Model e objeto.

Código 1.2 - Update

public bool UpdateUser(int id, UserModel model)
{
    try
    {
        if (id != model.UserId)
        {
            return false;
        }
        
        _db.Entry(model).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
        _db.SaveChanges();

        return true;
    }
    catch (Exception ex)
    {
        _logger.LogError($"Method: {MethodBase.GetCurrentMethod().Name} - Exception: {ex.Message} - {DateTime.Now}");
        throw;
    }
}

O código 1.2 mostra o update que tenho que fazer logo em seguida, mas eu recebo um erro depois de chamar esse método falando que o objeto já está em uso e não pode fazer a operação.

Então é agora que entra o AsNoTracking. Para utilizar esse comando, é necessário importar o using Microsoft.EntityFrameworkCore. Depois de importar, é necessário colocar o comando dentro do método de select.

Código 1.3 - Usando o AsNoTracking

_db.UserModels.AsNoTracking().FirstOrDefault(x => x.UserId == id);

O código 1.3 mostra que depois do objeto basta colocar o AsNoTracking() antes da condição.

Em resumo, depois de colocar esse comando antes da condição o update não mais deu problema, ou seja, a atualização dos dados aconteceu perfeitamente.

Espero que tenha gostado e qualquer dúvida pode entrar em contato comigo pelo site www.mauriciojunior.net ou na rede social @mauriciojunior.net_.