Garanta a consistência dos dados com simultaneidade otimista
Nesta página
Visão geral
Neste guia, você pode aprender como usar o controle de concorrência otimista com o EF Core Provider. O controle de concorrência otimista garante que os dados não sejam substituídos entre o momento em que um aplicação os lê e o momento em que o aplicação os grava no banco de banco de dados. O provedor do EF Core oferece suporte a duas maneiras de implementar o controle de concorrência otimista :
Tokens de simultaneidade, usando o atributo
ConcurrencyCheck
ou o método fluente da APIIsConcurrencyToken()
Controle de versão de linha, usando o atributo
Timestamp
ou o métodoIsRowVersion()
da API fluente
Dica
Recomendamos garantir uma simultaneidade otimista usando apenas uma das implementações anteriores por entidade.
Tokens de simultaneidade
Você pode garantir uma simultaneidade otimista em uma propriedade especificada usando um token de simultaneidade. Ao consultar a entidade, o provedor de núcleo da EF rastreia o token de simultaneidade. Em seguida, quando o provedor chama o método SaveChanges()
ou SaveChangesAsync()
, ele compara o valor do token de simultaneidade com o valor salvo no banco de banco de dados para garantir que o valor original não tenha sido alterado.
Você pode configurar um token de concorrência especificando o atributo ConcurrencyCheck
ao definir uma classe. O exemplo seguinte mostra como especificar o atributo ConcurrencyCheck
na propriedade LastModified
de uma classe Customer
:
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [ ] public DateTimeOffset LastModified { get; set; } }
Você também pode configurar um token de concorrência utilizando o método IsConcurrencyToken()
. Chame o método IsConcurrencyToken()
no método OnModelCreating()
da classe DbContext
, como mostrado no exemplo a seguir:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.LastModified) .IsConcurrencyToken(); }
O EF Core Provider suporta a configuração de tokens de simultaneidade em qualquer tipo de propriedade suportado pelo driver. Você também pode definir vários tokens de simultaneidade em uma única entidade. Se você precisar atualizar um token de simultaneidade, deverá fazê-lo manualmente.
Controle de Versão de Linha
Você pode garantir uma simultaneidade otimista usando o controle de versão de linha. O controle de versão de linha permite que você acompanhe as alterações em uma entidade especificando um campo de versão que aumenta automaticamente quando a entidade é alterada. Você pode configurar o controle de versão de linha especificando o atributo Timestamp
ao definir uma classe. O exemplo seguinte mostra como especificar o atributo Timestamp
na propriedade Version
de uma classe Customer
:
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [ ] public long Version { get; set; } }
Você também pode configurar a versão de linha usando o método IsRowVersion()
. Chame o método IsRowVersion()
no método OnModelCreating()
da classe DbContext
, como mostrado no exemplo a seguir:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.Version) .IsRowVersion(); }
O EF Core Provider suporta o controle de versão de linha em apenas uma única propriedade de uma entidade. A propriedade deve ser do tipo long
, int
, ulong
ou uint
.
Limitações
Considere as seguintes limitações ao configurar o controle de concorrência otimista em um banco de dados de dados que compartilha dados com outros aplicativos:
Outros aplicativos devem oferecer suporte aos mesmos mecanismos que você está usando para controle de concorrência otimista em seu aplicação Entity Framework Core.
Outros aplicativos devem oferecer suporte a verificações de tokens de simultaneidade e campos de versão de linha durante qualquer operação de atualização ou exclusão.
Se você estiver usando o controle de versão de linha, outros aplicativos deverão mapear campos de versão de linha para o nome da propriedade seguido da string:
_version
. O aplicação deve incrementar o valor do campo em 1 para cada atualização.
Informações adicionais
Para obter mais informações sobre o controle de concorrência otimista com o Entity Framework Core,consulte Concorrência otimista na documentação do Microsoft Entity Framework Core.