当前位置: 首页 > 面试题库 >

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

濮阳品
2023-03-14
问题内容

不太确定如何措辞这个问题,但是就到这里了。我正在一个项目中,其中多个客户端应用程序正在通过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子句中添加属性以进行更新和删除,以确保记录自访问以来没有更改。



 类似资料:
  • 问题内容: 我有一个SQL Server 2008数据库和一个asp.net前端。 当用户当前正在编辑记录但不确定哪种是最好的方法时,我想实现一个锁定。 我的想法是为记录创建一列,并在用户拉出该记录时将其设置为true,这意味着所有其他用户都具有只读访问权限,直到第一个用户完成编辑为止。 但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留为,表示其他人无法对其进行编辑,对吗? 如何实现某

  • 我有一个在Azure中运行的Web应用程序。我设置了实体框架来访问我的数据库。“编辑”和“删除”视图在我的本地计算机上以及部署到临时插槽时工作。当我推到生产槽时,我得到一个错误。出于某种原因,控制器没有读取记录ID,即使它显然是在URL中传递的,并且是在RouteConfig中设置的。 更新:这是请求。https://teamweb.azurewebsites.net/JobTracking/Ed

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 我正在尝试实现一个日志过滤器来记录对Quarkus应用程序APIendpoint的请求和响应。我正在使用Quarkus 1.13.3。最终和quarkus resteasy反应。在调用非阻塞endpoint时,尝试记录请求主体时遇到问题。这是我用来记录请求的代码: 当我调用具有@Blocking注释的APIendpoint时,这可以正常工作,但当我调用非阻塞API时,会出现以下错误: 有没有办法绕

  • 问题内容: 我有这样的现有功能 该表有四列来存储整数值,我正在使用上述功能分别读取它们。 现在,我将其转换为Entity Framework。 但是上面的函数返回一个错误 输入的字符串格式不正确 因为它返回列名本身。 我不知道如何解决这个问题,因为我是EF的新手。 任何帮助,将不胜感激 谢谢 问题答案: 这可能有助于解决您的问题: 现在,该方法适用于动态输入方法参数。

  • 问题内容: 要获取包含整数的列的最大值,我可以使用以下T-SQL命令 是否有可能使用实体框架获得相同的结果。 假设我有以下模型 如何获得最大的年龄? 问题答案: 试试这个 并确保您位于文件的顶部