Entity framework 4 这两种刷新dbContext的方法的区别是什么?

Entity framework 4 这两种刷新dbContext的方法的区别是什么?,entity-framework-4,concurrency,refresh,Entity Framework 4,Concurrency,Refresh,我正在使用EF4.4,我想更新许多实体,但是其他一些用户可以修改第一个用户修改的许多实体。所以我得到了一个并发异常。另一种情况是,第一个用户尝试添加许多新的寄存器,而另一个用户同时添加了其中的一些。所以我有一个例外,存在一些寄存器(唯一约束) 我希望确保第一个用户完成其操作,只添加不存在的寄存器(添加除第二个用户添加的实体之外的所有实体) 为此,我需要更新dbContext中的实体,以便看到至少有两个选项 首先,在捕获更新异常时的捕获中,我可以执行以下操作: ex.Entries.Single(

我正在使用EF4.4,我想更新许多实体,但是其他一些用户可以修改第一个用户修改的许多实体。所以我得到了一个并发异常。另一种情况是,第一个用户尝试添加许多新的寄存器,而另一个用户同时添加了其中的一些。所以我有一个例外,存在一些寄存器(唯一约束)

我希望确保第一个用户完成其操作,只添加不存在的寄存器(添加除第二个用户添加的实体之外的所有实体)

为此,我需要更新dbContext中的实体,以便看到至少有两个选项

首先,在捕获更新异常时的捕获中,我可以执行以下操作:

ex.Entries.Single().Reload();
第二种选择是:

myContext.Entry(instance.Reload();
我猜第二个选项只刷新我用作参数的实体,但是如果问题是我需要刷新许多实体,我该怎么做呢

第一个选项,
Single().Reload
,当您这样做时,它真正起到了什么作用

ex.Entries.Single().Reload();
您确定已刷新有问题的实体。它所做的是从
DbUpdateConcurrencyException.Entries
中获取唯一的(
Single
)实体,该实体无法保存到数据库中(在并发异常的情况下,它始终恰好是一个)

当你这样做的时候

myContext.Entry(instance.Reload();
除非您知道在调用
SaveChanges
之前只有一个实体发生了更改,否则无法确定是否刷新了正确的实体。如果将实体与子实体一起保存,其中任何一个都可能导致并发问题。

在EF 6.x(6.1.3)中,下面的代码将允许您查找所有更改;你问问题的方式

试试看
{
var list=db.ChangeTracker.Entries().Select(x=>x.Entity.ToList();
var objContext=((IObjectContextAdapter)您的上下文);
刷新(System.Data.Entity.Core.Objects.RefreshMode.ClientWins,ListofRefreshDobj);
等待db.Entry().ReloadAsync();
返回内容(HttpStatusCode.
,“”);
}
捕获(例外e)
{
返回内容(HttpStatusCode.
,“”);
}
解释:
ChangeTracker
中查询
条目
,并将其存储在列表中

var listOfRefreshedObj = db.ChangeTracker.Entries().Select(x => x.Entity).ToList();
接下来是刷新上下文。在某些情况下(行被删除等),这将抛出一个您可以捕获的异常<代码>刷新模式。ClientWins
告诉EF在下次更新时接受所有修改的客户端单元。在某些情况下,您可能希望向用户提示更改并让他们决定。这里就是一个例子


无论如何,在收到
DbUpdateConcurrencyException
之后,您可能正在做这整件事

如果有很多违规的实体,所有的实体都会被刷新,或者只是一个一个地刷新?总是只有一个。EF单独保存每个对象,导致碰撞的第一个对象抛出异常。当然,可能会有更多的冲突,但它们还没有被保存,所以EF不知道它们应该被刷新。他们会在你下次尝试储蓄时被注意到。
objContext.Refresh(System.Data.Entity.Core.Objects.RefreshMode.ClientWins, listOfRefreshedObj);