Både i EF6 och EF-core, när du arbetar med SQL Server, måste du använda denna mappning:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IsConcurrencyToken konfigurerar en egenskap som samtidighetstoken, men (när den används för en byte[]
egendom)
- datatypen är
varbinary(max)
- dess värde är alltid
null
om du inte initierar den - dess värde ökas inte automatiskt när en post uppdateras.
IsRowVersion å andra sidan,
- har datatypen
rowversion
(i SQL Server, ellertimestamp
i tidigare versioner), så - dess värde är aldrig null, och
- dess värde ökas alltid automatiskt när en post uppdateras.
- och den konfigurerar automatiskt egenskapen att vara en optimistisk samtidighetstoken.
Nu när du uppdaterar en Car
du kommer att se två uppdateringssatser:
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örsta satsen uppdaterar ingenting, men den ökar radversionen, och den kommer att skapa ett samtidighetsundantag om radversionen ändrades däremellan.
[System.ComponentModel.DataAnnotations.Schema.Timestamp]
attribut är dataanteckningarna som motsvarar IsRowVersion()
:
[Timestamp]
public byte[] RowVersion { get; set; }