Baik di EF6 dan EF-core, saat bekerja dengan Sql Server, Anda harus menggunakan pemetaan ini:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IsConcurrencyToken mengonfigurasi properti sebagai token konkurensi, tetapi (saat menggunakannya untuk byte[]
properti)
- tipe datanya adalah
varbinary(max)
- nilainya selalu
null
jika Anda tidak menginisialisasinya - nilainya tidak bertambah secara otomatis saat catatan diperbarui.
IsRowVersion di sisi lain,
- memiliki tipe data
rowversion
(di Sql Server, atautimestamp
di versi sebelumnya), jadi - nilainya tidak pernah nol, dan
- nilainya selalu bertambah secara otomatis saat catatan diperbarui.
- dan secara otomatis mengonfigurasi properti menjadi token konkurensi optimis.
Sekarang ketika Anda memperbarui Car
Anda akan melihat dua pernyataan pembaruan:
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 ...
Pernyataan pertama tidak memperbarui apa pun, tetapi meningkatkan versi baris, dan akan mengeluarkan pengecualian konkurensi jika versi baris diubah di antaranya.
[System.ComponentModel.DataAnnotations.Schema.Timestamp]
atribut adalah anotasi data yang setara dengan IsRowVersion()
:
[Timestamp]
public byte[] RowVersion { get; set; }