【问题标题】:Entity Framework 5 InvalidOperationException on Reload重新加载时的实体框架 5 InvalidOperationException
【发布时间】:2013-03-22 12:07:08
【问题描述】:

我尝试使用重新加载功能放弃一些更改。我得到一个InvalidOperationException。 我怎样才能防止这种情况发生?

DbContext.SaveChanges();
//Entity is in Unchanged state
//Make some changes to an entity
//Change state to modified
DbContext.Entry(entity).Reload();

InvalidOperationException
在没有先调用 EntityMemberChanging 或 EntityComplexMemberChanging 的情况下调用了 EntityMemberChanged 或 EntityComplexMemberChanged 具有相同属性名称的相同更改跟踪器。有关信息 关于正确报告更改,请参阅实体框架 文档。

编辑:
我已启用和禁用 ProxyCreationEnabledLazyLoadingEnabled
也尝试了不同的方法。所有这些尝试都会抛出相同的异常。

var objContext = ((IObjectContextAdapter)context).ObjectContext;
objContext.Refresh(RefreshMode.ClientWins, entry.Entity);


entry.OriginalValues.SetValues(entry.GetDatabaseValues());

希望我能得到解决方案。不想处理完整的 DbContext 以重新加载所有数据。

【问题讨论】:

  • 这可能与您的情况无关,但想检查一下。您是否在程序中执行任何类型的多线程/异步?喜欢使用任何 PLINQ 或 4.5 async/await?
  • @tostringtheory 已经在没有任何线程的情况下检查了它。同样的问题。
  • 这有线程问题或自我跟踪实体的味道...应用程序类型是什么 - Web、WPF...?
  • 您能否包含用于将状态更改为已修改的确切代码?我在很多地方看到了一些关于如何做到这一点的困惑,包括在 SO 上。

标签: c# entity-framework


【解决方案1】:

引用this MSDN thread / post

“值得注意的是,无论您是通过代理类使用更改跟踪还是显式调用 entitymemberchanged,该错误都会显示。每当我执行 entitymemberchange 并在创建该线程之外的线程上更改时,我似乎都会收到错误消息objectcontext/objectstatemanager, 无论我是同步还是异步执行这两个函数, 使用锁还是让线程显式休眠. 我突然想到这是 objectstatemanager 的某种“真正的错误”, 而不是是一个简单的解决方法。球在你的球场上,MSFT。”

附:评论太长了。

【讨论】:

    【解决方案2】:

    如果代码与您发布的一样,其中对象是从 DbContext 加载的,然后从同一个 DbContext 重新加载,则不应将其显式标记为已修改;对实体进行更改就足以将其标记为已修改。换句话说:

    var o = new SimpleObject { Stuff = "One" };
    db.SimpleObjects.Add(o);
    db.SaveChanges();
    
    o.Stuff = "Two"; // implicitly marks as Modified for you, since it's still Attached
    
    // Unnecessary
    //db.Entry(o).State = System.Data.EntityState.Modified;
    
    db.Entry(o).Reload(); // Works for me
    

    【讨论】:

      【解决方案3】:

      我发现在具有导航属性的代理实体上重新加载失败。

      作为一种解决方法,重置当前值,然后像这样重新加载:

      var entry = DbContext.Entry(entity);
      entry.CurrentValues.SetValues(entry.OriginalValues); 
      entry.Reload();
      

      【讨论】:

        【解决方案4】:

        我有类似的情况,有相同的异常描述。在我的例子中,我试图从上下文中删除一个实体,它与仍在调用的 propertychanged 处理程序有关。

        在使用

        从上下文中删除实体之前,我刚刚删除了处理程序
        MyEntity.PropertyChanged -= MyPropertyChangedHandler;
        context.MySet.Remove(MyEntity); //it works after removing the handler
        

        希望这对某人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多