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(
}
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().
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_.