Cả trong EF6 và EF-core, khi làm việc với Sql Server, bạn phải sử dụng ánh xạ này:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IsConcurrencyToken không định cấu hình một thuộc tính làm mã thông báo đồng thời, nhưng (khi sử dụng nó cho một byte[]
tài sản)
- kiểu dữ liệu là
varbinary(max)
- giá trị của nó luôn là
null
nếu bạn không khởi tạo nó - giá trị của nó không tự động tăng lên khi bản ghi được cập nhật.
IsRowVersion mặt khác,
- có kiểu dữ liệu
rowversion
(trong Máy chủ Sql, hoặctimestamp
trong các phiên bản trước đó), vì vậy - giá trị của nó không bao giờ là rỗng và
- giá trị của nó luôn tự động tăng lên khi bản ghi được cập nhật.
- và nó tự động định cấu hình thuộc tính để trở thành một mã thông báo đồng thời lạc quan.
Bây giờ khi bạn cập nhật Car
bạn sẽ thấy hai câu lệnh cập nhật:
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 ...
Câu lệnh đầu tiên không cập nhật bất cứ điều gì, nhưng nó làm tăng chuyển đổi hàng và nó sẽ đưa ra một ngoại lệ đồng thời nếu đảo ngược được thay đổi ở giữa.
[System.ComponentModel.DataAnnotations.Schema.Timestamp]
thuộc tính là chú thích dữ liệu tương đương với IsRowVersion()
:
[Timestamp]
public byte[] RowVersion { get; set; }