código

20 jun, 2022

Você conhece AsNoTracking? Vou explicar um pouco sobre isso

Publicidade

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 atualizar 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.UserId == userId)
}
catch (Exception ex)
{
_logger.LogError(
amp;quot;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(amp;quot;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.netou na rede social @mauriciojunior.net_.