Både i EF6 og EF-core, når du arbejder med SQL Server, skal du bruge denne kortlægning:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IsConcurrencyToken konfigurerer en egenskab som samtidighedstoken, men (når den bruges til en byte[] ejendom)
- datatypen er
varbinary(max) - dens værdi er altid
nullhvis du ikke initialiserer den - dens værdi øges ikke automatisk, når en post opdateres.
IsRowVersion på den anden side,
- har datatypen
rowversion(i SQL Server ellertimestampi tidligere versioner), så - dens værdi er aldrig null, og
- dens værdi øges altid automatisk, når en post opdateres.
- og den konfigurerer automatisk egenskaben til at være et optimistisk samtidighedstoken.
Nu når du opdaterer en Car du vil se to opdateringsudsagn:
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 ...
Den første sætning opdaterer ikke noget, men den øger rækkeversionen, og den vil give en samtidighedsundtagelse, hvis rækkeversionen blev ændret i mellemtiden.
[System.ComponentModel.DataAnnotations.Schema.Timestamp] attribut er dataanmærkningerne svarende til IsRowVersion() :
[Timestamp]
public byte[] RowVersion { get; set; }