Breezejs新版本的合并实体功能

时间:2013-08-22 09:02:59

标签: javascript breeze

我最近升级到最新版本的Breezejs(从1.3.6到1.4.1)。 我有一种情况,我从服务器获取实体,我得到像

{
    "$type": "X.Y.Reference, X.Y",
    "ReferenceTypeId": "BookEdited",
    "ShouldDisplay": true,
    "ShortTitle": "Informationsethik 1995",
    "Title": "Informationsethik",
    "Year": "1995",
    "YearResolved": "1995",
    "CloudProjectSubset": "ReferenceNavigation",
    "Id": "34e1f0d1-eda7-4926-a13f-e75e43ff66b5",
    "ProjectId": "syncproject1"
  },

我希望您注意到“ShouldDisplay”属性设置为true。 后来,由于我的应用程序的逻辑,我做了另一个查询,我得到了其他人,同一个实体,这次是这样的:

{
    "$type": "X.Y.Reference, X.Y",
    "ReferenceTypeId": "BookEdited",
    "ShortTitle": "Informationsethik 1995",
    "Title": "Informationsethik",
    "Year": "1995",
    "YearResolved": "1995",
    "CloudProjectSubset": "ReferenceNavigation",
    "Id": "34e1f0d1-eda7-4926-a13f-e75e43ff66b5",
    "ProjectId": "syncproject1"
  },

注意我不再获得属性“ShouldDisplay”,由于我的逻辑,这是正确的。 每次查询后,Breezejs都会将实体合并到本地缓存中。关键是,在第二次查询后使用版本1.3.6时,我仍然将我的实体'ShouldDisplay'设置为true(这是我想要的),因为第二个查询返回没有该属性的同一实体,然后不被覆盖。然而,如果我使用versio 1.4.1,那么属性(即使没有序列化)仍会被覆盖并设置为null,这不是我想要的。 简而言之,在我看来,在版本1.3.6中,只返回属性实际上被覆盖,而使用1.4.1,所有属性都被覆盖。 在Breezejs的website或网络上,我没有找到关于这种“合并”行为的信息,只有关于未决更改的合并策略的设置,这不是我现在面临的问题。有人知道这是Breezejs应该工作的方式还是我错过了一些配置?谢谢。

1 个答案:

答案 0 :(得分:0)

好的,在调试了Breeze的源代码后,我已经弄明白了。我会发布我的解决方案,以防它对某人或者对于Breeze家伙有用,如果他们想要检查这是一个功能还是一个bug。 我已经替换了这一行

return val !== undefined ? val : dp.defaultValue;

这一行

return val;

在方法ctor.getRawValueFromServer和ctor.getRawValueFromClient中。关键是:当必须合并实体时,会触发一个名为updateEntity的方法,该方法遍历目标实体属性并检查它们是否在从服务器获取的原始实体中定义。如果原始实体上该属性的值不是“未定义”,则该方法将替换目标实体上的属性。问题是,使用原始代码行(如上所示),如果值为'undefined',则返回属性的默认值,在我的情况下为'null',因此我的实体的所有属性都是更换。现在它工作正常。我已经对Breezejs的最新版本(截至今天)进行了修正,目前版本为1.4.9。 希望它可以帮到某人。