拦截在ASP.NET WebAPI中删除 - Breeze

时间:2013-08-01 13:07:08

标签: asp.net asp.net-web-api breeze

我正在使用BreezeJS连接到使用ASP.NET开发的OData端点。我使用EFContextProvider来保存更改。

这一切都很好,但现在我想不删除数据,但将Deleted字段设置为true。我该如何拦截删除?

谢谢!

此致 Matthijs ter Woord

3 个答案:

答案 0 :(得分:2)

您需要在EFContextProvider实例上使用BeforeSaveEntities拦截器将EntityState更改为“已修改”,并在您的实体上设置已删除标记。例如:

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) 
{
    var orderInfos = saveMap[typeof(Order)];
    foreach (var info in orderInfos) 
    {
        var order = (Order)info.Entity;
        if (info.EntityState == EntityState.Deleted) 
        {
            order.Deleted = true;
            info.EntityState = EntityState.Modified;
        }
    }
}

答案 1 :(得分:0)

将实体标记为删除后,您仍然必须调用SaveChanges来保留它,并且无论您是在修改,删除还是创建新实体,都可以拦截保存调用。

保存呼叫拦截在BeforeSaveEntity和/或BeforeSaveEntities中完成。 (见http://www.breezejs.com/documentation/efcontextprovider

答案 2 :(得分:0)

您的代码无法设置EntityInfo.EntityState ...正如您所观察到的那样。我不确定为什么我们决定阻止这个选项,但让我们把它作为给定的。这是一个值得尝试的东西。

您可以从传递给EntityInfo的{​​{1}}中删除saveMap({a BeforeSaveEntities);这应该让Breeze不要试图保存删除实体请求。

现在向字典添加新的Dictionary<Type, List<EntityInfo>> ,这次EntityInfo的{​​{1}}处于已修改状态。以下三行应该可以解决问题:

var newInfo = context.CreateEntityInfo(revisedEntity, EntityState.Modified);
newInfo.OriginalValuesMap['Deleted']=true;  // so Context persists change to this property
saveMap[revisedEntity.getType()].add(newInfo);

我没试过这个;我正在编写代码,所以它可能甚至不会编译。但是你明白了。

警告 EntityState有可能将此实体发送回Breeze客户端,就像它已被真正修改一样;这可能会混淆可能使缓存保持在未修改状态的breeze,就像保存修改后的实体一样。请测试一下。如果发生了这种情况,您可以在保存成功回调中添加一些额外的逻辑,以从缓存中删除此实体(将其置于“分离”状态)。

2013年8月5日更新

我接受你的挑战。当我在EntityInfo方法的第一行设置断点时,请解释为什么以下代码在我的调试器中有效: - )

saveMap[typeof(Zza.Model.Customer)][0].OriginalValuesMap; // Count = 0
saveMap[typeof(Zza.Model.Customer)][0].OriginalValuesMap["Deleted"] = true; 
saveMap[typeof(Zza.Model.Customer)][0].OriginalValuesMap["Deleted"]; // true
saveMap[typeof(Zza.Model.Customer)][0].OriginalValuesMap.Count; // 1