实体框架的悲观并发

Jea*_*eus 4 c# database asp.net-mvc entity-framework

在我的项目中,用户可以根据需要编辑一些数据集.但是,由于项目规范,一次只能有一个用户编辑某个数据集/访问数据集的编辑页面.因此,如果用户A正在编辑数据集1,则只要用户A在该页面上,用户B就不能访问数据集1的编辑页面,反之亦然.

我做了一些阅读和Pessimistic Concurrency似乎是我正在寻找的,一个页面被"锁定",直到该页面内的用户离开,这解释了我的标题.

我仍然是ASP.NET和Web开发的新手.我想问一下我是否朝着正确的方向前进我的问题,我怎样才能在我的项目中实现它(我只看到乐观并发的样本)以及是否有其他方法,我没有遇到过,解决我的问题.

Sir*_*ifi 5

首先,我要说的是你的问题是关于数据库和EF,而不是ASP.NET MVC.顺便说一下,有两种基本类型的并发控制:

悲观的并发性将数据锁定在用户请求的时间和他保存的时间之间进行更改,以便其他用户无法在此期间保存更改相同的数据.

没有锁定并假设第二个用户试图更改数据的乐观并发不会与第一个用户保存的更改冲突,但如果存在冲突,则第二个用户的更改将中止,并且仅保留第一个用户的更改.
EF不直接支持悲观并发.

所以我认为最好的选择是EF支持的乐观并发,正如您可能知道的那样,它通过检查更新前和更新后的数据来确定用户B是否在用户A检索它并更新它之间对其进行了修改.如果它改变了,则丢弃用户A的修改,如果没有,则用户A的修改被更新到数据库中.

要实现Optimistic并发,您只需为模型定义RowVersion属性:

public byte[] RowVersion { get; set; }
Run Code Online (Sandbox Code Playgroud)

在您的模型配置中,您应该告诉EF它在属性中具有行版本的行为:

Property(p => p.RowVersion).IsRowVersion();
Run Code Online (Sandbox Code Playgroud)

现在,如果用户A检索数据,并且用户B检索相同数据并且用户B在用户A保存其更改之前保存更改,则用户A的更改将被丢弃并抛出异常:

存储更新,插入或删除语句会影响意外的行数(0).自实体加载后,实体可能已被修改或删除.刷新YourModelName条目.

更多信息.