【问题标题】:Why would the entityAspect of my query items be null?为什么我的查询项的 entityAspect 为空?
【发布时间】:2013-03-20 20:24:46
【问题描述】:

使用由 SharePoint 支持的微风,如 here 所述,并使用 TypeScript 而不是 JS。

在 DataService 类中,我创建一个 EntityManager 并执行一个查询:

private servicePath: string = '/api/PATH/';
private manager: breeze.EntityManager;

constructor() {
    this.init();
}

private init(): void {
    this.manager = new breeze.EntityManager(this.servicePath);
}

public ListResponses(): breeze.Promise {
    var query = breeze.EntityQuery.from("Responses");
    return this.manager.executeQuery(query);
}

然后我从我的视图模型中调用它,它工作正常:

private loadResponses(): void {
    this.dataservice.ListResponses().then((data) => {
        this.handleResponsesLoaded(data);
    }).fail((error) => {
        this.handleDataError(error);
    });
}

private handleResponsesLoaded(data:any): void {
    for (var i = 0; i < results.length; i++){
        this.extendItem(results[i]);
    }
    this.renderList(results, "#tp-responses-list");
}

但我尝试扩展每个项目失败了,因为项目的entityAspect 为空:

private extendItem(item: any): void {
    item.entityAspect.propertyChanged.subscribe(() => {  // FAILS HERE
        setTimeout(() => {
            if (item.entityAspect.entityState.isModified()) {
                this.dataservice.SaveChanges().then((result) => {
                    tracer.Trace("SaveChanged Result: " + result);
                }).fail((error) => {
                    this.handleDataError(error);
                });
            }
        }, 0);
    });
}

在检查结果项时,我可以看到它只是普通数据对象,具有我期望的所有属性,但没有实体优点:

我刚开始接触微风,所以提出问题的最佳方式可能是:我在这里做错了什么?

【问题讨论】:

    标签: javascript sharepoint typescript edmx breeze


    【解决方案1】:

    如果 Breeze 在其元数据中找不到与它作为查询结果接收的匹配类型,它只会返回“原始”json 对象。

    您的元数据不可用的原因通常是由于以下两种解释之一:

    1) 您没有序列化查询响应中的类型信息。 [BreezeController] 属性或 [BreezeJsonFormatter] 属性都可以完成此操作。

    2) 查询本身不返回描述元数据的类型。在这种情况下,您可以直接在客户端上创建元数据,也可以通过“元数据”方法从服务器返回。 (有关第一个示例,请参见 Breeze Zip 包中的 NoDb 示例)。

    如果您想将任何查询结果强制转换为“已知”元数据类型,您也可以查看 JsonResultsAdapter,但如果您使用 [BreezeController] 属性,这通常不是必需的。

    希望这会有所帮助。

    【讨论】:

    • Jay - 感谢您的及时回复。我正在使用从服务引用的 edmx 中提取的元数据,但肯定有问题 - 我会尝试修复它(我有很多实体类型,我不想手动应用元数据如果我可以帮助客户)。因此,快速跟进:Breeze 如何将类型与元数据匹配?它是基于类型名称还是基于接口或...等属性映射?
    • 您可以通过 getEntityTypes 方法获取 metadataStore 包含的类型列表。每个实体类型都有一个“名称”和一个“短名称”属性,两者都可以匹配。
    • 我会在早上看看那个。再次感谢。
    • 将跟踪添加到getEntityType 帮助我很快找到了问题。请参见上面的分辨率。感谢您的帮助。
    • JcFx,我们有兴趣在将 Breeze 与 Sharepoint 集成方面做得更好,但对 Sharepoint 知之甚少。你似乎有更多的东西。我们很乐意就如何最好地实现我们的目标获得更多意见。您愿意通过微风@ideablade.com 与我联系吗?
    【解决方案2】:

    以下答案不是我的,而是 OP 的。它张贴在问题本身中,而它应该有答案。


    问题是命名空间不匹配。我正在从 Visual Studio 服务引用生成的 edmx 中提取元数据。此 edmx 使用它正在调用的服务的命名空间。我的代理对象位于不同的命名空间中。 Breeze 的实体查找(即使使用短名称)的格式为 Type#Namespace,所以我没有找到匹配项。我在服务器上调整了我的自定义 BuildJsonMetadata 方法以交换命名空间,现在我已经正确装饰了可以正常工作的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多