我刚刚启用了“并发模式”属性来修复我的一个实体。
当我尝试更新时,一切都很有效。
但是当我尝试删除实体时,我总是会收到此错误:
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": {}
}
答案 0 :(得分:2)
只是一个猜测,但你在数据库中打开了某种形式的级联删除吗?如果是这样,那么问题可能是父母的删除导致孩子也被删除,当breeze服务器代码启动时,尝试再次删除“已经”删除的孩子。当此删除无法找到子进程时,它会抛出并发异常。
避免这种情况的方法是使用BeforeSaveEntities拦截点并从'saveMap'中删除任何已删除实体(属于级联删除关系的一部分)的所有子节点。请参阅此页面上有关BeforeSaveEntities的Breeze文档:http://www.breezejs.com/documentation/contextprovider
答案 1 :(得分:1)
我们的应用程序框架中隐藏了一个mecanism,它在保存对数据库的更改之前更新了属性。所以这不是一个微风问题。
现在已在解决方案中添加了一个过滤器,以便在删除时排除此模式。