并发标记(并发令牌)
本节主要介绍如何配置并发标记。(后面在介绍保存数据时,再介绍如何处理并发冲突的示例)
配置为并发标记的属性用于实现乐观并发控制。
数据批注:
using System.ComponentModel.DataAnnotations; public class Person { public int PersonId { get; set; } [ConcurrencyCheck] public string FirstName { get; set; } public string LastName { get; set; } }
Fluent API:
modelBuilder.Entity<Person>() .Property(b => b.FirstName) .IsConcurrencyToken();
Timestamp/rowversion
Timestamp/rowversion是一个属性。这个属性指示:每次插入或者更新行时,数据库会自动为其生成新值。此属性也被视为并发标记。
作用:确保你在更新的数据行在你查询之后发生了更改后,你会得到一个异常。
具体细节取决于所使用的数据库提供程序;对于SQL Server,通常使用byte[]属性,它将被设置为数据库中的ROWVERSION列。
可以按如下所示将属性配置为 timestamp/rowversion:
数据批注:
public class Person { public int PersonId { get; set; } [ConcurrencyCheck] public string FirstName { get; set; } [Timestamp] public string LastName { get; set; } }
Fluent API:
class Team { public int TeamId { get; set; } public byte[] RecordTimestamp { get; set; } } class MyDbContext: DbContext { public DbSet<BlogModel> Blogs { get; set; } public DbSet<PostModel> Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Team>() .Property(b => b.RecordTimestamp) .IsRowVersion(); …… }