我正在使用BreezeJS连接到使用ASP.NET开发的OData端点。我使用EFContextProvider来保存更改。
这一切都很好,但现在我想不删除数据,但将Deleted字段设置为true。我该如何拦截删除?
谢谢!
此致 Matthijs ter Woord
答案 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,就像保存修改后的实体一样。请测试一下。如果发生了这种情况,您可以在保存成功回调中添加一些额外的逻辑,以从缓存中删除此实体(将其置于“分离”状态)。
我接受你的挑战。当我在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