Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Đồng thời lạc quan:IsConcurrencyToken và RowVersion

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ặc timestamp 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; }


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy danh sách tất cả các ngôn ngữ trong SQL Server (T-SQL)

  2. Excel 32-bit và SQL Server 64-bit

  3. Xem lịch sử công việc của SQL Server Agent với Azure Data Studio

  4. Rủi ro xung đột UUID sử dụng các thuật toán khác nhau

  5. ĐẶT SỐ KHOẢN khi sử dụng