【问题标题】:Breeze - not return changes introduced in BeforeSaveEntities to client?Breeze - 不将 BeforeSaveEntities 中引入的更改返回给客户端?
【发布时间】:2015-07-15 03:24:11
【问题描述】:

我正在努力为 BeforeSaveEntities 中的概念问题找到解决方案。

简而言之,我想避免服务器通知客户端我在 BeforeSaveEntities 的保存图中引入的实体删除。

下面是更长的故事:-)

数据结构:我有一个名为 PrimaryData 的实体,它有一些称为 SecondaryData 的并行松散耦合实体。对于每个 PrimaryData,都存在多个 SecondaryData。

业务逻辑:每当用户在客户端删除PrimaryData时,服务器应该删除所有相关的SecondaryData。

安全要求:不应通知客户端 SecondaryData 已被删除。

实现:我已经实现了一个 BeforeSaveEntities 函数,在该函数中我捕捉到 PrimaryData 的删除,并为 SecondaryData 添加了额外的 EntityInfo,我也想将它们删除到 SaveMap。

一切都按预期进行。 PrimaryData 和 SecondaryData 都被删除。

问题:不幸的是,XHR 显示​​返回给客户端的包中包含已删除的 SecondaryData。这违反了我上面的安全要求,即不应告知客户端有关删除 SecondaryData 的信息。客户端不需要知道这部分应用程序中的SecondaryData,因此没有功能需要传输信息。我还是要重新加载缓存。

问题:是否可以指示微风不返回已删除的SecondaryData?例如。通过我可以添加到 SaveMap 的 EntityInfo 中的设置?

br 莫腾

【问题讨论】:

  • 三个字:代码,sn-p,请

标签: breeze


【解决方案1】:

Breeze 没有内置方法来执行此操作。您可以从 SaveResult 中删除违规实体,然后再将其发送回客户端。我不知道您使用的是哪种服务器端技术,但以下是它在 .NET WebAPI 中的外观:

[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
    SaveResult sr = _context.SaveChanges(saveBundle);
    // remove entities of type SecondaryData
    sr.Entities = sr.Entities.Where(e => e.GetType() != typeof(SecondaryData)).ToList();
    return sr;
}

【讨论】:

  • 我有点期待这不是内置功能:-/ 您从 SaveResult 中删除 SecondayData 的建议很好。它适用于这个问题中的用例。
  • 但我还有另一个用例,用户直接在客户端上操作 SecondaryData。显然,这不适用于上述 SaveChanges。我想我可以为这篇文章中的用例创建一个命名保存,这将从 SaveResult 中删除 SecondaryData。但是一个确定的用户可以通过使用正常的 SaveChanges 来规避这个问题,这将返回已删除的 SecondaryData。由于总体目的是向坚定的用户隐藏我的业务逻辑,所以我有点卡住了。
  • 史蒂夫回答了我的问题,并提出了适用于我所说的用例的建议。我会相信你的。但我认为我的解决方案是使用 BeforeSaveEntities 函数中的实体框架直接在数据库中进行删除。我需要小心我将使用的上下文,但应该是可能的。这将绕过微风,因此微风将无法告诉客户它。
  • 除了命名保存之外,您可以根据其他信息决定在服务器上做什么(删除或保留SecondaryData)。例如,用户的身份,或更改集中的其他实体。
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
相关资源
最近更新 更多