V EF6 i EF-core musíte při práci se SQL Serverem použít toto mapování:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IsConcurrencyToken nakonfiguruje vlastnost jako token souběžnosti, ale (při použití pro byte[]
vlastnost)
- datový typ je
varbinary(max)
- jeho hodnota je vždy
null
pokud jej neinicializujete - jeho hodnota se při aktualizaci záznamu automaticky nezvyšuje.
IsRowVersion na druhou stranu
- má datový typ
rowversion
(na serveru SQL Server nebotimestamp
v dřívějších verzích), takže - jeho hodnota není nikdy nulová a
- jeho hodnota se vždy automaticky zvýší při aktualizaci záznamu.
- a automaticky nakonfiguruje vlastnost jako optimistický token souběžnosti.
Nyní, když aktualizujete Car
uvidíte dvě prohlášení o aktualizaci:
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 ...
První příkaz nic neaktualizuje, ale inkrementuje verzi řádku a vyvolá výjimku souběžnosti, pokud byla mezitím změněna verze řádku.
[System.ComponentModel.DataAnnotations.Schema.Timestamp]
atribut je ekvivalent datových poznámek k IsRowVersion()
:
[Timestamp]
public byte[] RowVersion { get; set; }