12

不太确定如何措辞这个问题,但它就在这里。我正在开发一个项目,其中多个客户端应用程序通过 WCF 服务访问一个数据源。它可能不相关,但 WCF 服务正在利用实体框架来访问此数据源。每当客户查询要编辑的记录时,我想防止其他客户编辑同一条记录,直到第一个客户完成更新。

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

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

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

4

1 回答 1

9

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

解释了乐观并发模式

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

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

EF 会将 Timestamp/RowVersion 属性添加到您的表中。它将在更新期间进行检查。并在更改时由数据库自动更新。

编辑:更好地解释。

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

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

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

catch (DbUpdateConcurrencyException ex)

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

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

于 2013-02-05T23:36:34.433 回答