我维护着一个 Breeze ASP.NET Web API,该 API 最初是大约 10 年前编写的。这不是我写的,我也不是 Breeze 方面的专家。该客户端是第三方开发的手机应用程序。这取代了与 API 同时内部开发的应用程序的先前版本。
我最近发现,两个版本的客户端有时都会使用相同的数据多次调用
SaveChanges
。这导致数据库中出现重复数据。我可以重现这个,但不是以一致的方式。好像有点随意。
随着时间的推移,我们会让第三方参与进来,但这不会很快发生。所以,我想更改服务器以停止重复。通过检查 saveBundle,我可以确定其中的实体实例的保存是否已经在进行中。问题是,当我停止重复调用时,
SaveResult
的内容应该是什么?我不想触发任何客户行为。我希望它忽略 SaveResult
。我不希望用户被错误消息打扰。
最“轻松”的方法是附加一个 BeforeSaveEntities 委托,该委托将通过查看保存包来检查重复项。 如果是重复的保存,委托将返回一个空的保存包,以便没有任何内容可保存。
[HttpPost]
public SaveResult SaveWithComment(JObject saveBundle)
{
ContextProvider.BeforeSaveEntitiesDelegate = IgnoreDupSaves;
return ContextProvider.SaveChanges(saveBundle);
}
private Dictionary<Type, List<EntityInfo>> IgnoreDupSaves(Dictionary<Type, List<EntityInfo>> saveMap)
{
if (IsDuplicateSave(saveMap)) // you implement IsDuplicateSave method
{
return new Dictionary<Type, List<EntityInfo>>();
}
return saveMap;
}
Breeze 客户端首先应该防止重复保存。 如果保存已经在进行中,它通常不允许保存,但可以覆盖此行为以允许并行保存。