Breeze ComplexType属性数组错误

Breeze ComplexType属性数组错误,breeze,Breeze,我发现了一个关于ComplexType属性的bug。我有一个对象,它有一个属性,该属性是我在客户端元数据中定义为复杂属性的其他对象的集合,即“isComplexType:true”。但是,复杂类型的所有属性都设置为“未定义”。我做了一点调试,发现: // target and source may not be entities that can also be complexTypes. function updatePropertyFromRawEntity(dp, target, rawS

我发现了一个关于ComplexType属性的bug。我有一个对象,它有一个属性,该属性是我在客户端元数据中定义为复杂属性的其他对象的集合,即“isComplexType:true”。但是,复杂类型的所有属性都设置为“未定义”。我做了一点调试,发现:

// target and source may not be entities that can also be complexTypes.
function updatePropertyFromRawEntity(dp, target, rawSource) {
    var val = getPropertyFromRawEntity(rawSource, dp);
    if (val === undefined) return;
    if (dp.isComplexProperty) {
        var coVal = target.getProperty(dp.name);
        dp.dataType.dataProperties.forEach(function (cdp) {
            // recursive call
            updatePropertyFromRawEntity(cdp, coVal, val);
        });
    } else {
        target.setProperty(dp.name, val);
    }
}
rawSource参数是一个数组(对于complexTypes),是一个对象数组。因此,问题在于调用getPropertyFromRawEntity()时,它传递的是数组而不是对象:

function getPropertyFromRawEntity(rawEntity, dp) {
    var propName = dp.nameOnServer || dp.isUnmapped && dp.name;
    return parseValueForDp(rawEntity[propName], dp);
}

因此,rawEntity[propName]始终是未定义的,因为它是一个数组。

Breeze ComplexType具有由元数据指定的定义良好的结构。任何属性(键除外)的数据类型都可以是complexType。然而,我认为,你想要的是一个“非类型化”的结构。这可以通过将属性定义为具有“Undefined”数据类型来实现,例如:

  var newProp = new DataProperty({
                name: "Foo"
                dataType: DataType.Undefined,
                isNullable: true,
                isUnmapped: true
            });
  entityType.addProperty(newProp);

“未定义”数据类型将接受任何类型和结构的数据

我明白你的意思,但不是那样的。一个未定义的属性不会是可观察的,我需要它是可观察的。我还知道ComplexType有一个定义良好的结构。我很确定代码中的某个地方有缺陷。快速修复方法是检查rawSource是否为数组并执行foreach循环。然而,你可能比我更清楚微风里发生了什么。附带问题:有没有办法在保存更改时将整个对象树发送回服务器?现在ComplexTypes的实例必须是标量的,即它们不能是数组。我们将在即将发布的版本中放宽这一限制,我们将提供对NoSQL数据库的支持。这方面的代码非常重要。至于将整个树发送回服务器,saveChanges方法允许您列出要保存的对象。(默认情况下,仅发送添加/修改或删除的实体)。因此,您需要遍历对象图(考虑到entityMetadata可用,这并不难),并收集要保存的实体列表。您是否估计下一个版本何时发布?NoSQL支持版本有望在两三周内发布,在此之前,可能会有针对其他问题的bug发布。当它进来时,我会发回这里。