Javascript Breeze合并策略:覆盖属性,保留更改

Javascript Breeze合并策略:覆盖属性,保留更改,javascript,breeze,Javascript,Breeze,我有一个使用breeze的web应用程序。我对实体进行部分加载,这意味着在一个加载中我填充实体的某些属性,在另一个加载中我填充其他属性。示例:这将是我的实体定义(伪代码,javascript): 让我们假设我进行了第一次加载,并填充了property1和property2。然后我手动更改property1的值,以便我的实体包含在挂起的更改中。 我还没有保存更改。 现在我进行第二次加载(MergeStrategy设置为OverwriteChanges,否则,因为我的实体有一个挂起的更改,所以它的属

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

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

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

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

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

希望这有帮助

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

Thanx Jay,实际上,在我的情况下,合并功能已经可以很好地用于部分加载。在第一次加载中,只有属性1和2被反序列化到客户端并填充,在第二次加载(通常)中,props 3和4被发送到客户端并正确填充。但是,如果中间有一个挂起的更改,实体将被更新(设置了MergeStrategy.OverwriteChanges),但挂起的更改将丢失。无论如何,我正在调查breeze的源代码,看看是否可以更改它。我的全部观点是,我希望挂起的更改不会被重置。
myEntity = {
  property1: '',
  property2: '',

  property3: '',
  property4: '',
}