EF Core 7 -  Os novos recursos ExecuteDelete e ExecuteUpdate - II


 Vmos continuar a apresentar os novos recursos do EF Core 7 focando agora no método ExecuteUpdate usado para atualizar uma grande quantidade de dados.

Continuando o artigo anterior vamos mostar agora como usar o método ExecuteUpdate.

Os métodos ExecuteUpdate e ExecuteUpdateAsync se comportam de maneira muito semelhante aos métodos ExecuteDelete. A principal diferença é que uma atualização requer saber quais propriedades atualizar e como atualizá-las. Isso é obtido usando uma ou mais chamadas para o método SetProperty.

Assim da mesma forma que para excluir para atualizar primeiro temos que filtrar as entidades que desejamos atualizar e a seguir invocar o método ExecuteUpdate.

Entretanto, às vezes é útil executar comandos de atualização ou exclusão no banco de dados sem envolver o rastreador de alterações.

Além disso para atualizar entidades, precisamos usar o novo método SetProperty.

A sintaxe usada é a seguinte:


a
wait context.Blogs.ExecuteUpdateAsync(
    s => s.SetProperty(b => b.Nome, b => b.Nome + " *Destaque!*"));
   

O primeiro argumento de SetProperty seleciona a propriedade que deve ser atualizada por meio de um lambda, e o segundo argumento é o novo valor dessa propriedade também usando um lambda. Neste código estamos obtendo o valor existente e acrescentando "Destaque!".

Vamos aproveitar o projeto criado no artigo anterior e vamos atualizar a propriedade Nome do cliente definindo como condição que isso será feito para clientes cujo ClienteId for menor ou igual a 900.

using (var context = new AppDbContext())
{
        var registros = context.Clientes.Count();
        Console.WriteLine($"\nExistem {registros} de clientes na tabela\n");

        Console.WriteLine("\nAtualizando nomes dos Clientes...");

        var clientesAtualizados  = context.Clientes
                                          .Where(p => p.ClienteId <= 900)
                                          .ExecuteUpdate(p => p.SetProperty(x => x.Nome, x => "Atualizado"))
;

        Console.WriteLine($"\n{clientesAtualizados} clientes foram excluidos da tabela...");
    }

 

Executando o código teremos o seguinte resultado.

Se consultarmos a tabela Clientes veremos o nome alterado:

Para poder atualizar mais de uma propriedade podemos definir na consulta após o filtro a invocação do método SetProperty mais de uma vez.

Como exemplo vamos atualizar o nome e o email dos clientes para isso vamos definir dois SetProperty:

var clientesAtualizados = context.Clientes.Where(p => p.ClienteId <= 900)
                          .ExecuteUpdate(p => p.SetProperty(x => x.Nome, x =>
"Novo Nome")
                                               .SetProperty(e => e.Email, e => "Novo Email"
));

O código usado para realizar a atualização é o seguinte:

using (var context = new AppDbContext())
    {
        var registros = context.Clientes.Count();
        Console.WriteLine($"\nExistem {registros} de clientes na tabela\n");

        Console.WriteLine("\nAtualizando nomes dos Clientes...");

        var clientesAtualizados = context.Clientes
                                          .Where(p => p.ClienteId <= 900)
                                          .ExecuteUpdate(p => p.SetProperty(x => x.Nome, x => "Novo Nome")
                                                                           .SetProperty(e => e.Email, e => "Novo Email"));

        Console.WriteLine($"\n{clientesAtualizados} clientes foram atualizados na tabela...");
    }

Executando iremos obter o resultado :

Da mesma form que ExecuteDelete podemos obter o número de linhas afetadas.

E estamos conversados...

Pegue o projeto aqui :  EF7ExecuteDeleteUpdate,zip

"Porque todos pecaram e destituídos estão da glória de Deus;
Sendo justificados gratuitamente pela sua graça, pela redenção que há em Cristo Jesus."
Romanos 3:23,24

Referências:


José Carlos Macoratti