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, outimestamp
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; }