通过乐观并发确保数据一致性
Overview
在本指南中,您可以学习;了解如何将乐观并发控制与 EF Core 提供程序结合使用。 乐观并发控制可确保在应用程序应用程序读取数据和将数据写回数据库之间,数据不会被覆盖。 EF Core 提供程序支持两种方法来实现乐观并发控制:
并发令牌,通过使用
ConcurrencyCheck
属性或IsConcurrencyToken()
Fluent API方法行版本控制,使用
Timestamp
属性或IsRowVersion()
Fluent API方法
提示
我们建议为每个实体仅使用上述实现之一,以确保开放式并发。
并发令牌
您可以使用并发令牌确保指定属性上的开放式并发。 查询实体时,EF Core 提供程序会跟踪并发令牌。 然后,当提供商调用SaveChanges()
或SaveChangesAsync()
方法时,它会将并发令牌的值与数据库中保存的值进行比较,以确保原始值未发生更改。
您可以通过在定义类时指定ConcurrencyCheck
属性来配置并发令牌。 以下示例展示了如何在Customer
类的LastModified
属性上指定ConcurrencyCheck
属性:
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [ ] public DateTimeOffset LastModified { get; set; } }
您还可以使用IsConcurrencyToken()
方法配置并发令牌。 IsConcurrencyToken()
OnModelCreating()
调用DbContext
类的 方法中的 方法,如以下示例所示:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.LastModified) .IsConcurrencyToken(); }
EF Core 提供程序支持在驾驶员支持的任何属性类型上设置并发令牌。 您还可以在单个实体上设立多个并发令牌。 如果需要更新并发令牌,则必须手动执行此操作。
行版本控制
您可以使用行版本控制来确保开放式并发。 行版本控制允许您通过指定在实体更改时自动递增的版本字段来追踪实体的更改。 您可以通过在定义类时指定Timestamp
属性来配置行版本控制。 以下示例展示了如何在Customer
类的Version
属性上指定Timestamp
属性:
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [ ] public long Version { get; set; } }
您还可以使用IsRowVersion()
方法配置行版本控制。 IsRowVersion()
OnModelCreating()
调用DbContext
类的 方法中的 方法,如以下示例所示:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.Version) .IsRowVersion(); }
EF Core 提供程序仅支持对实体的单个属性进行行版本控制。 该属性的类型必须为long
、 int
、 ulong
或uint
。
限制
在与其他应用程序共享数据的数据库上配置乐观并发控制时,请考虑以下限制:
其他应用程序必须支持与您在 Entity Framework Core应用程序中用于乐观并发控制的相同机制。
其他应用程序必须支持在任何更新或删除操作期间检查并发令牌和行版本字段。
如果您使用行版本控制,其他应用程序必须将行版本控制字段映射到属性名称,后跟string :
_version
。 每次更新时,应用程序都必须将该字段的值递增1 。
更多信息
有关使用 Entity Framework Core 进行乐观并发控制的详细信息,请参阅 乐观并发 在Microsoft实体框架核心文档中。