不太确定如何说出这个问题,但在这里。我正在开发一个项目,其中多个客户端应用程序通过WCF服务访问一个数据源。它可能不相关,但WCF服务正在利用实体框架来访问此数据源。每当客户端查询记录进行编辑时,我想阻止其他客户编辑同一记录,直到第一个客户完成更新为止。
如果我错了,请纠正我,但我相信这也称为同步和异步数据访问。
我的问题是,实现此功能的行业最佳做法是什么。有没有办法从数据库端(使用SQL)控制它,还是必须通过客户端完成?
我考虑过为每个表包含一个布尔“EditMode”列,并在编辑时将其设置为true,并在允许其他客户端访问该记录之前检查是否设置为true。
答案 0 :(得分:7)
最佳做法是使用RowVersion和乐观锁定。
Optimistic Concurrency Patterns解释道。
如果首先使用代码,则在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子句中添加属性以进行更新和删除 确保记录自访问后没有变化。