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_.