2

我正在使用并发和实体框架 4.0 进行一些测试。我正在使用两个用户执行以下操作:

用户 1 加载寄存器。
用户 2 加载寄存器。
用户2删除一个寄存器。
用户 1 尝试删除已被客户端 2 删除的同一个寄存器。

我使用的代码如下:

using(Context myContext = new Context))
{
Users myUser = new Users { IDUser = paramUser.IDUser };
myContext.Users.Attach(myUser);
myContext.Users.DeleteObject(myUser);
miContext.SaveChanges();
}

当用户 1 尝试删除寄存器时,得到以下异常:“存储更新、插入或删除语句影响了意外的行数 (0)。实体可能已被修改或删除,因为实体被加载。刷新 ObjectStateManager 条目” .

我知道这是一个并发问题,但我认为 EF 的默认行为是始终应用​​更改。如果我设置并发控制,则比较我抓取的数据和更新之间是否有变化。但在这种情况下,我的实体的所有属性都具有“无”的并发模式,而不是“固定”。

面对这种情况最好的方法是什么?我的意思是很多时候我不想控制并发,只应用最后一次修改。例如,我有一个包含用户的表,一个字段是电话号码。我总是想设置我要更新的电话,而与其他用户是否在我的请求和我的更新之间修改寄存器无关。如果其他用户更改数据,我会用我的更新覆盖它。

在这种情况下,我没有看到问题,我试图删除数据库中不存在的寄存器,这是我想要的,寄存器不在数据库中。如果我尝试修改已被其他用户修改的信息,但在删除操作中,我可以理解更新中的问题......

4

0 回答 0