Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Concurrence optimiste :IsConcurrencyToken et RowVersion

Dans EF6 et EF-core, lorsque vous travaillez avec Sql Server, vous devez utiliser ce mappage :

modelBuilder.Entity<Product>() 
.Property(t => t.RowVersion) 
.IsRowVersion(); // Not: IsConcurrencyToken

IsConcurrencyToken configure une propriété en tant que jeton de concurrence, mais (lorsque vous l'utilisez pour un byte[] propriété)

  • le type de données est varbinary(max)
  • sa valeur est toujours null si vous ne l'initialisez pas
  • sa valeur n'est pas automatiquement incrémentée lorsqu'un enregistrement est mis à jour.

IsRowVersion d'autre part,

  • a le type de données rowversion (dans Sql Server, ou timestamp dans les versions antérieures), donc
  • sa valeur n'est jamais nulle, et
  • sa valeur est toujours auto-incrémentée lorsqu'un enregistrement est mis à jour.
  • et il configure automatiquement la propriété pour qu'elle soit un jeton de concurrence optimiste.

Désormais, lorsque vous mettez à jour une Car vous verrez deux instructions de mise à jour :

DECLARE @p int
UPDATE [dbo].[Product]
SET @p = 0
WHERE (([Id] = @0) AND ([Rowversion] = @1))
SELECT [Rowversion]
FROM [dbo].[Product]
WHERE @@ROWCOUNT > 0 AND [Id] = @0

UPDATE [dbo].[Car]
SET ...

La première instruction ne met rien à jour, mais elle incrémente la rowversion et lève une exception de concurrence si la rowversion a été modifiée entre-temps.

Le [System.ComponentModel.DataAnnotations.Schema.Timestamp] l'attribut est l'équivalent des annotations de données de IsRowVersion() :

[Timestamp]
public byte[] RowVersion { get; set; }