这是my previous issue的后续问题 - 这个问题变得有点混乱,与Telerik数据服务更相关。
我从服务器收到的元数据缺少关联节点中的引用约束,虽然我已经在我的模型上设置了外键属性。
因此我考虑在FetchMetadata的回调中手动将这些约束添加到我的实体。
这是可能的,有人可以提供一个简单的例子来说明如何做到这一点吗?
[编辑]
这是我到目前为止所拥有的:
manager.fetchMetadata().then(function () {
var mandatType = manager.metadataStore.getEntityType("Mandate");
mandatType.autogeneratedKeyType = breeze.AutoGeneratedKeyType.Identity;
var openPositionsProp = new breeze.NavigationProperty({
name: "OpenPositions",
entityTypeName: "OpenPositions:#DirectDebitModel",
isScalar: true,
associationName: "OpenPosition_Mandate_Mandate_OpenPositions",
foreignKeyNames: ["Id"]
});
mandatType.addProperty(openPositionsProp);
});
但它引发了例外:
The 'Mandate:#DirectDebitModel' EntityType has already been added to a MetadataStore and therefore no additional properties may be added to it.
答案 0 :(得分:1)
因此,您获得了元数据,但实体之间没有关系。嗯,我还没有获得metaData,并尝试创建相关的其他模型属性。
最好的办法是在构造函数中添加一个导航类型的属性。
http://www.breezejs.com/sites/all/apidocs/classes/EntityType.html#method_addProperty
如果是我,我会在构造函数中以这种方式(或类似的东西)尝试 -
myEntity.addProperty({
associatedEntity: {
entityTypeName: "AssociatedEntity", isScalar: true,
associationName: "AssociatedEntity_MyEntitys", foreignKeyNames: ["associatedEntityId"]
}
});
如果myEntity是当前实体的名称,则AssociatedEntity将是您的导航属性,associatedEntityId是myEntity的一个属性,它引用另一个实体。当然,为了使这成为双向关系,您还需要向AssociatedEntity添加属性。
associatedEntity.addProperty({
myEntitys: {
entityTypeName: "MyEntity", isScalar: true,
associationName: "AssociatedEntity_MyEntitys", foreignKeyNames: ["myEntityId"]
}
});
答案 1 :(得分:1)
好的,我有一种可能的方法,你现在可以使用它。
像现在一样从Teleriks OData Feed中获取元数据。
通过 MetadataStore.exportMetadata 方法导出作为上一步结果创建的metadataStore。这将以Breeze的原生格式返回相同元数据的“stringified”json。这种格式更容易使用。
通过 JSON.parse 将此字符串转换为json。
修改json以添加参照约束信息。请参阅Breeze Native Metadata format docs here
创建一个新的MetadataStore并将修改后的json导入其中。
使用此MetadataStore创建一个新的EntityManager并使用它。此EntityManager现在应具有完整的Breeze元数据,以便与其余Feed一起使用。
希望这是有道理的!
我们计划在下一版本中发布一种混合元数据。遗憾的是,它并未涵盖您的案例,因为我们专注于如何将自定义元数据添加到现有的metadataStore,而不是实际编辑/修改现有的元数据。
另一种选择是我们(IdeaBlade)确实为这类工作提供咨询。我们可能会为您编写一个为第1步到第6步执行的工具。如果感兴趣,请联系breeze@ideablade.com并提及此帖子。