自实体加载后,实体可能已被修改或删除

时间:2013-06-04 18:56:58

标签: entity-framework concurrency task-parallel-library

我正在他们自己的上下文中执行代码,但它导致数据在主线程上下文中不同步。所以我需要在其他上下文完成工作之后刷新实体,然后才能更新它。

不幸的是,我收到了一个OptimisticConcurrencyException并且无法找出问题是哪个实体需要刷新?有没有办法找出导致OptimisticConcurrencyException的实体?这条消息根本没用...

  

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:存储   更新,插入或删除语句会影响意外的数量   行(0)。自实体以来,实体可能已被修改或删除   装了。刷新ObjectStateManager条目。 --->   System.Data.OptimisticConcurrencyException:存储更新,插入或   delete语句影响了意外的行数(0)。实体   自实体加载以来可能已被修改或删除。刷新   ObjectStateManager条目。

1 个答案:

答案 0 :(得分:0)

也许最好的解决方案是在其他线程完成后在主线程上下文中创建一个新的context

否则,如果您需要重用context,这里有一个方便的方法来刷新您的上下文对象。

    public void RefreshAll()
    {
        // Get all objects in state manager with entityKey
        // (context.Refresh will throw an exception otherwise)
        var refreshableObjects = (from entry in
                ObjectContext.ObjectStateManager.GetObjectStateEntries(
                                                    EntityState.Deleted
                                                  | EntityState.Modified
                                                  | EntityState.Unchanged)
                                  where entry.EntityKey != null
                                  select entry.Entity);

        ObjectContext.Refresh(RefreshMode.StoreWins, refreshableObjects);
    }