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