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
null
hvis 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 ellertimestamp
i 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; }