admin

使用实体框架时锁定记录以进行编辑的最佳实践

sql

不太确定如何措辞这个问题,但是就到这里了。我正在一个项目中,其中多个客户端应用程序正在通过WCF服务访问一个数据源。可能无关紧要,但是WCF服务正在利用实体框架来访问此数据源。每当客户端查询记录以进行编辑时,我都希望在第一个客户端完成更新之前,其他客户端无法编辑该记录。

如果我错了,请纠正我,但我相信这也称为同步和异步数据访问。

我的问题是,实现此功能的行业最佳实践是什么?有没有一种方法可以从数据库端进行控制(使用SQL),还是必须通过客户端来完成?

我考虑过为每个表包括一个布尔值’EditMode’列,并在编辑时将其简单地设置为true,并在允许另一个客户端访问该记录之前检查是否将其设置为true。


阅读 180

收藏
2021-05-10

共1个答案

admin

最佳实践是使用RowVersion和Optimistic锁定。

解释了乐观并发模式

如果先使用代码,则在POCO中包含一个字段。

public virtual byte[] RowVersion { get; set; }

EF会将Timestamp / RowVersion属性添加到表中。在更新过程中将对其进行检查。并在更改时由DB自动更新。

编辑:更好地解释。

EF寻找的是作为并发字段的属性,因此您实际上可以使用一个或多个字段来控制并发。

entity.Property(p => p.RowVersion).IsConcurrencyToken()

在执行更新或删除时,您会捕获已定义的异常

catch (DbUpdateConcurrencyException ex)

EF将RowVersion视为并发令牌。这是常用的方法。由于SQLServer将自动为您更新此字段类型。因此非常快速和容易。但是您可以告诉EF属性是显式的并发令牌,并且有多个。

因此,EF应该在where子句中添加属性以进行更新和删除,以确保记录自访问以来没有更改。

2021-05-10