1

我正在尝试使用带有自定义 JsonResultsAdapter 的 Breeze 连接到第三方服务。

第三方服务在数组的根节点中具有与实体相关的“元数据”,然后变量位于“元数据”对象的“数据”属性中。

该格式有两种定义关系的方式。一种是通过“@ref”字段引用另一个实体的 id。另一种是通过内联定义相关对象(而不是“@ref”),它没有明确的 id,但只被“父”对象引用。

数据如下:

[{
   "id" : "abc",
   "type" : "foo", 
   "data": { "relationshipRef" : { "@ref" : "someid" } }
 },
 {
   "id": "someid",
   "type" : "bar",
   "data" : { "relationshipInline" : { "type" : "baz", 
                                       "data" : { "something" : "whatever", 
                                                  "innerRelation" : { "@ref" : "abc"} 
                                                } 
            }
  }]

我目前(在 JsonResultsAdapter 的 visitNode 函数中)将“数据”对象中的属性向上移动到“根”节点,然后用“@ref”键的值替换任何带有“@ref”属性的对象和在末尾附加一个 ID(以便关系可以使用 EntityType 中的原始名称)。IE,第一个对象将变为:

{
   "id" : "abc",
   "type" : "foo", 
   "relationshipRefID" : "someid"
}

这适用于顶级实体和关系,但我遇到了嵌套的问题。

您将如何解决这个问题?

我打算使用 ComplexTypes,但文档提到它们不能具有“navigationProperties”(关系),正如您在上面看到的那样(“innerRelation”属性)。

在某些情况下,实体可以嵌套到 3 级左右。

这是我当前的 visitNode 函数:

        visitNode: function(node, parseContext, nodeContext) {
            if(node instanceof Object && node.type != null) {
                if(node.deleted) {
                    //TODO: make sure the object is removed from the manager
                    return {ignore:true};
                }

                //We need to tweak the data structure to fit what breeze expects.
                //It expects properties to be in the same level as the "metadata" for an object ("type" etc),
                //So we need to move the properties from the data object into the node, and fix up relationships.
                if(parseContext.entityManager.metadataStore.getEntityType(node.type, true) != null) {

                    var data = node.data;
                    for(var key in data) {

                        var prop = data[key];
                        //Move any foreign key fields to be "relationID":id instead of "relation":{"@ref":id}
                        if(prop instanceof Object) {
                            var ref = prop["@ref"];
                            if(ref != null) {
                                node[key+"ID"] = ref
                                data[key] = null;
                                continue;
                            }
                        }
                        //TODO: Handle inline references <- This is where I need help!

                        node[key] = data[key];
                    }

                    return {
                        entityType: node.type,
                        nodeId: node.id
                    }
                }
                else {
                    return {ignore:true};
                }
            }
        }
4

1 回答 1

1

好吧,显然我应该在问这里之前进行更多测试。

事实证明,这会根据模型中定义的 navigationProperties 自动工作!惊人的。我确实必须为没有它们的内部节点生成 id,但这很简单。

于 2013-10-02T07:16:29.973 回答