Breeze如何针对本地缓存编写与实体相关的查询

时间:2014-07-18 13:55:05

标签: breeze

我试图弄清楚如何编写一个使用executeQueryLocally过滤我的相关实体的查询。

以下是我的例子:

   var queryStageConfigs = breeze.EntityQuery
       .from("Stages")
       .where("StageConfig.ConfigValue", '==', 'Green')
       .expand("StageConfig");

   var stageConfigs = self.manager.executeQueryLocally(queryStageConfigs);

这是我回来的错误:

错误:无法找到属性:entityType上的ConfigValue:阶段:#

MetadataStore

    //Stages Entity
    metadataStore.addEntityType({
        shortName: "Stages",
        //namespace: "MonitoringCenter",
        dataProperties: {
            id:             { dataType: DT.Int64, isPartOfKey: true },
            institutionId:  { dataType: DT.Int64 },
            qualifiedName:  { dataType: DT.String },
            displayName:    { dataType: DT.String },
            displayOrder:   { dataType: DT.Int64 },
        },
        navigationProperties: {
            institution: {
                entityTypeName: "Stages",
                isScalar: true,
                associationName: "Institution_Stages",
                foreignKeyNames: ["institutionId"]
            },
            stageConfig: {
                entityTypeName: "StageConfig",
                isScalar: false,
                associationName: "Stages_StageConfig"
            }
        }
    });
    metadataStore.setEntityTypeForResourceName("Stages", "Stages");

    //StageConfig Entity
    metadataStore.addEntityType({
        shortName: "StageConfig",
        //namespace: "MonitoringCenter",
        dataProperties: {
            id:             { dataType: DT.Int64, isPartOfKey: true },
            stageId:        { dataType: DT.Int64 },
            configName:     { dataType: DT.String },
            configValue:    { dataType: DT.String },
        },
        navigationProperties: {
            stages: {
                entityTypeName: "StageConfig",
                isScalar: true,
                associationName: "Stages_StageConfig",
                foreignKeyNames: ["stageId"]
            }
        }
    });
    metadataStore.setEntityTypeForResourceName("StageConfig", "StageConfig");

我正在编写JsonResultsAdpater,以便将JSON数据放入使用metadataStore创建的实体中设置实体之间的关系。

当我查询Stages实体时,我可以看到StageConfigs数组并且它不是空的。

有关我可能做错的任何线索?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

好的,你的例子有点令人困惑,因为我无法根据你的名字来判断关系的基数。一般来说,我认为像'stage'这样的复数名称是'Stage'实体的集合(即isScalar = false)。但在你的情况下,'阶段'属性实际上是标量和它的反转,'stageConfig'属性,一个单一化的名称,实际上是非标量。如果这个假设是正确的,那么你的查询将无法工作的原因是因为stage.stageConfig属性需要是一个标量才能使查询正常工作,除非你想使用'any / all'运算符。即

之类的东西
var queryStageConfigs = breeze.EntityQuery
   .from("Stages")
   .where("StageConfig", "any", "ConfigValue",  "==", 'Green');
   .expand("StageConfig");

(并且不应该将查询称为'queryStages',因为您正在查询并返回'阶段')

另外,这只是一个不错的选择,但是将所有的entityType名称保持为单数并且您的资源名称保持复数可能是一个好主意。这不是一个要求,但它肯定会混淆你有一个entityType singularized(StageConfig)和另一个复数(阶段)的方式。

我在代码中没有看到有关使用camelCase命名约定的任何提及,但该示例似乎表明您假设已设置此值。