不太确定如何措辞这个问题,但是就到这里了。我正在一个项目中,其中多个客户端应用程序正在通过WCF服务访问一个数据源。可能无关紧要,但是WCF服务正在利用实体框架来访问此数据源。每当客户端查询记录以进行编辑时,我都希望在第一个客户端完成更新之前,其他客户端无法编辑该记录。
如果我错了,请纠正我,但我相信这也称为同步和异步数据访问。
我的问题是,实现此功能的行业最佳实践是什么?有没有一种方法可以从数据库端进行控制(使用SQL),还是必须通过客户端来完成?
我考虑过为每个表包括一个布尔值’EditMode’列,并在编辑时将其简单地设置为true,并在允许另一个客户端访问该记录之前检查是否将其设置为true。
最佳实践是使用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子句中添加属性以进行更新和删除,以确保记录自访问以来没有更改。