这是我上一期的后续问题-这期有点乱,更多地与Telerik数据服务有关。
我从服务器接收的元数据缺少关联节点中的引用约束,尽管我已经在模型上设置了外键属性。
因此,我考虑在FetchMetadata的回调中手动将这些约束添加到我的实体中。
这可能吗?有人能提供一个简单的例子来说明如何做到这一点吗?
[EDIT]
到目前为止,我拥有的是:
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.
好的,我有一个可能的方法,您现在可以使用。
-
像现在一样从Teleriks OData提要中获取元数据。
-
通过metadataStore.exportMetadata方法导出上一步创建的元数据存储。这将以Breeze的原生格式返回相同元数据的"字符串化"json。这种格式更容易使用。
-
通过json将此字符串转换为json。parse.
-
修改json以添加引用约束信息。请参阅此处的Breeze原生元数据格式文档
-
创建一个新的MetadataStore并将修改后的json导入其中。
-
使用此MetadataStore创建一个新的EntityManager并使用它。此EntityManager现在应该具有完整的Breeze元数据,以便与提要的其余部分一起使用。
希望这是有道理的!
我们计划在下一个版本中发布一种形式的混合元数据。不幸的是,它没有涵盖您的情况,因为我们关注的是如何将自定义元数据添加到现有的元数据存储中,而不是实际编辑/修改现有的元数据。
另一种选择是,我们(IdeaBlade)确实为这类工作提供咨询。我们可能会为您编写一个执行步骤1到6的工具。请联系breeze@ideablade.com如果这是感兴趣的,并提到这篇文章。
所以您正在获取元数据,但它在实体之间没有关系。嗯,我还没有得到元数据,并试图创建其他相关的模型属性。
最好是在构造函数上添加一个导航类型的属性。
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"]
}
});