删除实体时,Breeze SaveChanges始终抛出DbUpdateConcurrencyException

时间:2014-01-06 20:09:26

标签: c# entity-framework breeze

我刚刚启用了“并发模式”属性来修复我的一个实体。

当我尝试更新时,一切都很有效。

但是当我尝试删除实体时,我总是会收到此错误:

DBUpdateConcurrencyException

  

存储更新,插入或删除语句会影响意外   行数(0)。自那以后,实体可能已被修改或删除   实体已加载。刷新ObjectStateManager条目。

有没有办法为删除操作禁用DBUpdateConcurrencyException?如果没有,我该如何管理这种类型的例外?

[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{

    try
    {
        return _breezeComponent.SaveChanges(saveBundle);
    }
    catch (DbUpdateConcurrencyException ex)
    {               
        //Workaround needed
    }

}
顺便说一句,我已经看过这些解决方案:How to ignore a DbUpdateConcurrencyException when deleting an entity。有什么办法可以将这个代码与Breeze引擎集成吗?

修改 我已经从版本1.4.5升级到1.4.7,我仍然遇到同样的问题。

如果我查看JSON对象,将entityState从“Deleted”更改为“Detached”会是一个解决方案吗? Breeze中有任何设置可以帮助我做到这一点吗?

{
  "entities": [
    {
      "EventId": 11111,
      "EventName": "Jon Doe",
      "EventCity": "Montreal",
      "EventDate": "2014-01-24T00:00:00Z",
      "TermDate": "2014-01-08T00:00:00Z",
      "Insertedby": "Terry",
      "InsertDate": "2014-01-06T14:31:14.197Z",
      "Updatedby": "Terry",
      "UpdateDate": "2014-01-07T15:50:53.037Z",
      "entityAspect": {
        "entityTypeName": "Event:#Cds.Corpo.GuestList.Models",
        "defaultResourceName": "Events",
        "entityState": "Deleted",
        "originalValuesMap": {},
        "autoGeneratedKey": {
          "propertyName": "EventId",
          "autoGeneratedKeyType": "Identity"
        }
      }
    }
  ],
  "saveOptions": {}
}

2 个答案:

答案 0 :(得分:2)

只是一个猜测,但你在数据库中打开了某种形式的级联删除吗?如果是这样,那么问题可能是父母的删除导致孩子也被删除,当breeze服务器代码启动时,尝试再次删除“已经”删除的孩子。当此删除无法找到子进程时,它会抛出并发异常。

避免这种情况的方法是使用BeforeSaveEntities拦截点并从'saveMap'中删除任何已删除实体(属于级联删除关系的一部分)的所有子节点。请参阅此页面上有关BeforeSaveEntities的Breeze文档:http://www.breezejs.com/documentation/contextprovider

答案 1 :(得分:1)

我们的应用程序框架中隐藏了一个mecanism,它在保存对数据库的更改之前更新了属性。所以这不是一个微风问题。

现在已在解决方案中添加了一个过滤器,以便在删除时排除此模式。