【发布时间】:2011-02-23 11:14:36
【问题描述】:
我有一个每 10 秒运行一次的 Windows 服务......每次运行时,它都会获取一些测试数据,对其进行修改并使用 EntityFramework 将其保存到数据库中。但是,在每第二次运行时,当我尝试保持更改时,我都会收到以下乐观并发异常:-
存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目
我知道一个事实,除了我的服务每 10 秒更新一次记录之外,没有其他任何东西写入该数据库。什么可能导致并发异常?
我认为对象图中某处的相关实体在第二次保存操作之前已被修改。 我实际上正在做的只是实例化一个新的对象上下文,并对我使用相同上下文检索到的一些记录调用保存操作。 以下代码有效---
var ctx = new blahEntities();
var profile = ctx.ProfileSet.Where(pr=>pr.FirstName.Contains("a")).FirstOrDefault();
profile.Address = "modified";
ctx.SaveChanges();
ctx.Refresh(RefreshMode.StoreWins,profile);
【问题讨论】:
-
我假设你打电话给
SubmitChanges()。您可以尝试每次都为您的ObjectContext创建一个新副本。 -
是的,我称之为“SaveChanges”,它相当于“SubmitChanges”的 EF。当您说“创建 ObjectContext 的新副本时,您的意思是每次服务进入循环时,您都希望传递一个新的 objectcontext 吗?现在,对象上下文在服务启动时创建一次,并被重用于执行数据库操作。有没有办法刷新现有的上下文?
-
您能否发布一些代码来说明您如何修改实体,因为我已经看到这是由于附加/分离实体而发生的。
-
所以我通过在成功保存后强制刷新(RefreshMode.StoreWins, entity) 解决了这个问题。我读到这是推荐的步骤 - msdn.microsoft.com/en-us/library/bb738618.aspx
标签: entity-framework concurrency entity