我正在尝试使用Breeze与自定义JsonResultsAdapter连接到第三方服务。
第三方服务具有与数组根节点中的实体相关的“元数据”,然后变量位于“元数据”对象的“数据”属性中。
格式有两种定义关系的方式。一个是通过“@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函数中)将“data”对象中的属性移动到“root”节点,然后使用“@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};
}
}
}
答案 0 :(得分:1)
嗯,显然我应该在问这里之前测试更多。
事实证明,这可以根据模型中定义的navigationProperties自动运行!真棒。我确实必须为没有它们的内部节点生成id,但这很简单。