如何忽略重复的 Breeze SaveChanges 调用

问题描述 投票:0回答:1

我维护着一个 Breeze ASP.NET Web API,该 API 最初是大约 10 年前编写的。这不是我写的,我也不是 Breeze 方面的专家。该客户端是第三方开发的手机应用程序。这取代了与 API 同时内部开发的应用程序的先前版本。

我最近发现,两个版本的客户端有时都会使用相同的数据多次调用

SaveChanges
。这导致数据库中出现重复数据。我可以重现这个,但不是以一致的方式。好像有点随意。

随着时间的推移,我们会让第三方参与进来,但这不会很快发生。所以,我想更改服务器以停止重复。通过检查 saveBundle,我可以确定其中的实体实例的保存是否已经在进行中。问题是,当我停止重复调用时,

SaveResult
的内容应该是什么?我不想触发任何客户行为。我希望它忽略
SaveResult
。我不希望用户被错误消息打扰。

asp.net-web-api entity-framework-6 breeze .net-4.8
1个回答
0
投票

最“轻松”的方法是附加一个 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 客户端首先应该防止重复保存。 如果保存已经在进行中,它通常不允许保存,但可以覆盖此行为以允许并行保存。

© www.soinside.com 2019 - 2024. All rights reserved.