【问题标题】:Update only a portion of an entity仅更新实体的一部分
【发布时间】:2013-02-08 07:16:04
【问题描述】:

我有一个视图模型,它有一个通过 Breeze 检索到的 observableArray 实体。

// define the viewmodel
function episodesViewModel() {

this.episodes = ko.observableArray();
...
}

每个剧集实体都有一系列属性,我希望在页面加载时完整填充这些属性。然后,如何在从服务器检索和保存回服务器时仅更新其中一个属性?其他属性要大得多,并且将保持静态,因此没有必要通过网络来回发送它们。

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

    或者,您可以通过带外 AJAX 调用走传统路线。

    添加您自己的响应 HTTP PATCH 的 Web API 控制器操作方法。你让它做正确的事。

    使用更改后的Episode 数据从客户端调用它(使用 jQuery AJAX 或 amplify.js)。这是直接的 WebAPI/AJAX 编程。

    如果用户直接对Episode 实体进行了更改,则您必须根据带外保存的情况进行调整。 EntityManager.getChanges('Episode') 将为您提供从缓存中更改的 Episode 实体。保存成功后,您可以在回调中调用episode.entityAspect.acceptChanges 告诉微风EntityManager episode 不再处于更改状态。

    【讨论】:

    • 如果您正在执行“public ?? CustomSaveEpisodeDto(EpisodeDto episodeDto) { ... }”之类的操作,您希望带外 API 控制器方法的外观和返回结果如何?
    【解决方案2】:

    好问题!

    我对您的第一个问题是“您确定额外的“静态属性”的负载权重实际上是一个问题?”我不得不问你……就像我不得不问自己一样……因为我喜欢预测问题并过早地解决它们。在测量之后,我发现所有这些工作和担心对于现场应用来说真的无关紧要。请原谅我的无礼。

    让我们假设您确实有问题。 episode 对象非常重(可能带有图像数据),您不能在模型中将其拆分为 EpisodeEpisodeDetail 类,它们之间存在一对一的关系。你被一个又大又胖的Epsiode 班级困住了。我知道会发生这种情况。只是检查。

    你可以做你想做的事。我想在 Breeze 中简化这种情况。今天有一种“OK”的方法(有些人可能称之为 hack)。我将在这里为您布置它的轮廓。你可以试试……然后告诉我们如何改进它。

    1. 在服务器上创建一个 DTO 类 (EpisodeSaveDto?),以表示您要保存的 Episode 对象的形状。它必须具有Id 和您要保存的属性。

    2. 它不会是来自服务器的正常元数据的一部分,因为它不是一个真实的实体。因此,在您的 BreezeJS 客户端上的 JavaScript 元数据中描述该 DTO 对象。然后,Breeze 会将您的 EpisodeSaveDto 视为一个实体。有关此技术的示例,请参阅"NoDb" Sample

    3. 创建EpisodeSaveDto 的实例并用您的更改填充它们。您正在更新,而不是添加新实例,因此请使用 EntityState-setting signature on the createEntity 方法。

      var episode = manager.createEntity("EpisodeDto", { id: origEpisode.id, foo: changedFooValue }, EntityState.Modified);
    4. 在服务器上,在您的自定义(派生)EFContextProvider 中,覆盖 BeforeSaveEntities 方法。此方法接收按类型排列的已更改实体的字典。

    5. 删除EpisodeSaveDto 更改的集合并将它们处理为适当的Episode 实体以进行保存。如果您没有使用 EF 或 SQL Db,那么您将在 ContextProvider 的实现中再次执行此操作,如 "NoDb" Sample 所示。

    6. 将准备保存的 Episode 实体集合添加到已更改实体的字典中,并将它们也附加到 EF 上下文。

    服务器上的 Breeze.NET 会将您制造的 Episode 实体保存在服务器上,并忽略传入的 EpisodeSaveDto(无论如何它都不知道如何保存)。

    忏悔:我是凭记忆写的,我对第 6 步有点模糊。我相信你明白了。我们有点假装 Breeze.NET。

    正如我在开头所说的,我想让这个场景变得更容易。我希望看到对可以接受和返回实体集的“命令”的内置支持。如果您认为我们应该这样做,请将您的投票添加到Breeze User Voice

    【讨论】:

    • 这是您将如何处理仅允许服务器更新实体的某些字段(例如 CreatedBy 和 UpdatedBy 字段)的情况,还是您会通过重构模型以其他方式处理 CreatedBy 和 UpdatedBy还是做其他事情?
    • 我正在考虑实施类似于您上面解释的解决方案。我不直接在微风中使用实体类的主要原因是验证。它用于两个不同的视图,验证略有不同。因此,假设我的 Entity 类中没有数据注释,但它们在我的 DTO 中。我的 DTO 会在服务器端得到验证吗?如果是这样,它会在调用 BeforeSaveEntity 之前发生吗?
    猜你喜欢
    • 2020-10-31
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多