Breeze Merge策略:覆盖属性,保持更改

时间:2014-08-21 15:35:15

标签: javascript breeze

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

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

  property3: '',
  property4: '',
}

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

2 个答案:

答案 0 :(得分:2)

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

听起来好像你想要某种形式的实体部分更新。为了实现这一目标,您需要自己进行合并,但是微风确实为您提供了足够的“绳索”。执行此任务。

  • 将您的查询执行到新的空白'临时' EntityManager的。
  • 对于查询在'临时'中返回的每个实体。 EntityManager的。
    • 在'真实'中找到相应的实体。 EntityManager的。 (您可以使用 EntityManager.getEntityByKey 方法。)
    • 如果找到该实体,请使用找到的实体中的originalValues地图( EntityAspect.originalValues )。实体,以确定每个属性是否有原始值,并根据此信息更新(或不更新)找到的实体。
    • 如果找不到该实体,请将其与“临时”实体分开。 EntityManager( EntityManager.detachEntity )并将其附加到' real' EntityManager( EntityManager.attachEntity )。

希望这会有所帮助。

答案 1 :(得分:0)

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