【问题标题】:Entity Framework - Optimistic Concurrency Issue实体框架 - 乐观并发问题
【发布时间】: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


【解决方案1】:

“意外的行数 (0)”表示您很可能没有在实体模型中正确映射或定义 ID 字段,或者您正在修改分离的实体并尝试保存它但它没有'没有关键信息。

运行 SQL Server profiler 或 Entity Framework Profiler,看看后台发生了什么。

【讨论】:

  • 刚遇到同样的问题
【解决方案2】:

曾经遇到过同样的问题,并花了数小时追查到出现故障的更新触发器。如果表上有任何正在更新的触发器,请确保它们正常工作。我在 Oracle 环境中工作,fwiw。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多