breezejs:向实体类型添加引用约束

时间:2013-09-04 14:51:09

标签: javascript odata breeze

这是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.

2 个答案:

答案 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)

好的,我有一种可能的方法,你现在可以使用它。

  1. 像现在一样从Teleriks OData Feed中获取元数据。

  2. 通过 MetadataStore.exportMetadata 方法导出作为上一步结果创建的metadataStore。这将以Breeze的原生格式返回相同元数据的“stringified”json。这种格式更容易使用。

  3. 通过 JSON.parse 将此字符串转换为json。

  4. 修改json以添加参照约束信息。请参阅Breeze Native Metadata format docs here

  5. 创建一个新的MetadataStore并将修改后的json导入其中。

  6. 使用此MetadataStore创建一个新的EntityManager并使用它。此EntityManager现在应具有完整的Breeze元数据,以便与其余Feed一起使用。

    希望这是有道理的!

    我们计划在下一版本中发布一种混合元数据。遗憾的是,它并未涵盖您的案例,因为我们专注于如何将自定义元数据添加到现有的metadataStore,而不是实际编辑/修改现有的元数据。

    另一种选择是我们(IdeaBlade)确实为这类工作提供咨询。我们可能会为您编写一个为第1步到第6步执行的工具。如果感兴趣,请联系breeze@ideablade.com并提及此帖子。

相关问题