【问题标题】:Breeze Merge strategy: overwrite properties, keep changesBreeze Merge 策略:覆盖属性,保留更改
【发布时间】:2014-08-22 22:31:40
【问题描述】:

我有一个使用微风的网络应用程序。我对实体进行部分加载,这意味着在一次加载中我填充实体的某些属性,在另一次加载中我填充其他属性。示例:这将是我的实体定义(伪代码、javascript):

myEntity = {
  property1: '',
  property2: '',

  property3: '',
  property4: '',
}

假设我进行了第一次加载并填充了 property1 和 property2。然后我手动更改 property1 的值,以便我的实体包含在挂起的更改中。 我还没有保存更改。 现在我进行第二次加载(否则将 MergeStrategy 设置为 OverwriteChanges,因为我的实体有一个待处理的更改,它的属性将不会更新)。在第二次加载操作结束时,property3 和 4 被填充,我仍然在实体上手动修改 property1 的值,但关键是挂起的更改丢失了(正确,根据 Breeze 文档)但我仍然想将 property1 设置为挂起的更改(以便能够保存它),因为我还没有保存它。这是否可以通过某种方式实现?

【问题讨论】:

    标签: javascript breeze


    【解决方案1】:

    您想要的可以实现,但您需要为它编写一些代码。默认情况下,breeze 要么更新整个实体 (MergeStrategy.OverwriteChanges),要么跳过整个实体,如果它之前以任何方式修改过 (MergeStrategy.PreserveChanges)。

    听起来好像您想要对实体进行某种形式的部分更新。为了完成此操作,您需要自己执行合并,但微风确实为您提供了足够的“绳索”来执行此任务。

    • 在新的空“临时”EntityManager 中执行查询。
    • 对于“临时”EntityManager 中查询返回的每个实体。
      • 在“真实”EntityManager 中找到对应的实体。 (您可以为此使用 EntityManager.getEntityByKey 方法。)
      • 如果找到实体,则使用“找到”实体中的 originalValues 映射 (EntityAspect.originalValues) 来确定每个属性是否存在原始值并更新(或不更新)找到的基于此信息的实体。
      • 如果找不到实体,请将其从“临时”EntityManager (EntityManager.detachEntity) 中分离,并将其附加到“真实”EntityManager (EntityManager.attachEntity )。

    希望这会有所帮助。

    【讨论】:

    • Thanx Jay,实际上在我的情况下,合并功能对于部分加载已经很有效了。在第一次加载中,只有属性 1 和 2 被反序列化到客户端并填充,在第二次加载(通常)时,道具 3 和 4 被发送到客户端并正确填充。但是,如果我在更新实体之间有一个挂起的更改(使用 MergeStrategy.OverwriteChanges 设置),但挂起的更改会丢失。无论如何,我正在调查微风的源代码,看看我是否可以改变它。
    • 我的重点是我希望不要重置待处理的更改。
    【解决方案2】:

    我很快尝试了 Jay 的方法,除了创建另一个 entityManager 的复杂性(使用相同的元数据存储,否则我无法将实体从一个管理器附加到另一个管理器),前提是我有一个“metadataByHand”存储一个自定义的 DataService(自定义适配器),将它们放在一起非常复杂,我看到当将属性从第二个加载合并到已经“修改”的实体时,我无法检索在该子集中加载了哪些属性(我们有多个子集),因此我认为这种方法不适合我。因此,我决定在每次加载之前自动执行 saveChanges(),并且只有在保存完成后,才加载第二部分。在这种情况下,“待定更改”不可能被取消。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2011-05-11
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多