Breeze.JS for SharePoint 2013保存更改时出错

Breeze.JS for SharePoint 2013保存更改时出错,breeze,sharepoint-2013,Breeze,Sharepoint 2013,对象extraMetadata未定义,并在breeze.labs.dataservice.sharepoint.js的第247行抛出错误 rawEntity.__metadata = { 'type': aspect.extraMetadata.type }; 我怀疑这是因为我没有在breeze的实体定义中定义在\uu metadata对象中找到的类型。任何关于如何正确定义我的类型的建议都是非常受欢迎的!这是我对其中一个对象的类型定义 models.Project = {

对象
extraMetadata
未定义,并在
breeze.labs.dataservice.sharepoint.js的第247行抛出错误

rawEntity.__metadata = { 'type': aspect.extraMetadata.type };
我怀疑这是因为我没有在breeze的实体定义中定义在
\uu metadata
对象中找到的类型。任何关于如何正确定义我的类型的建议都是非常受欢迎的!这是我对其中一个对象的类型定义

   models.Project = {
        name: 'Project',
        defaultResourceName: 'getbytitle(\'Projects\')/items',
        dataProperties: {
            ID: {
                type: breeze.DataType.Int32
            },
            Title: {
                nullable: false
            },
            StatusId: {
                type: breeze.DataType.Int32,
                nullable: false
            },
            SelectedApproverId: {
                type: breeze.DataType.Int32,
                nullable: false
            },
            Created: {
                type: breeze.DataType.DateTime
            },
            Modified: {
                type: breeze.DataType.DateTime
            }
        },
        navigationProperties: {
            Status: {
                type: "Status",
                foreignKeyNames: ['StatusId'],
                hasMany: false
            },
            SelectedApprover: {
               type: "User",
               foreignKeyNames: ["SelectedApproverId"]
            }
        }
    };
更新:2013年11月11日

如果我运行以下查询:

    return breeze.EntityQuery
           .from(metadataStore.getEntityType('Project').defaultResourceName)
           .orderBy('Created desc')
           .using(manager)
           .execute()
           .then(function (data) {
                console.log(data.results);
                return data.results;
           });
结果是一组简单的JavaScript对象,而不是Breeze实体,它们缺少
\uuu元数据
属性。我在想为什么会这样

更新日期:2014年11月12日

我已经确认,当我在
navigationProperties
下定义了多个实体时,就会出现此问题

请确保您使用的是BreezeJS v.1.4.12或更高版本

需要明确的是,您引用的代码位于我拥有的breeze.labs.dataservice.sharepoint.js文件的第147行(不是247行)

它位于
\u createChangeRequest
中,准备保存修改的实体。我假设您已经查询了一个
产品
实体,对其进行了更改,并在错误发生时将其保存回去

我不相信问题会追溯到您如何定义
产品
类型的元数据

您不应该为您的类型定义
\u元数据
属性
\uuuu metadata
属性是我们希望SharePoint(实际上是任何OData源)在查询实体的OData源时添加到它发送给客户端的JSON实体数据中的内容

\uuu元数据
不会为投影返回的结果定义,但是您的问题涉及修改的实体,因此我假设您是通过正常查询获得该实体的。。。没有
select
子句的语句

我想知道您是否在检索您正在修改的实体的查询的JSON有效负载中看到了
\uu metadata
属性。请检查查询请求中的网络流量。
如果您在那里没有看到,我们必须找出服务器没有发送的原因

背景 JSON节点上的
\uuu metadata
属性是与SharePoint OData服务器签订合同的关键部分。这就是Breeze客户端了解实体类型及其etag的方式

查看
jsonResultsAdapter.visitNode
updateEntityNode
方法。您将看到适配器如何使用
\uu元数据
来确定该数据的
EntityType
。您还将看到适配器将
\u元数据
移动到适配器结果的
extraMetadata
属性。BreezeJS随后将“额外元数据”从此结果对象移动到实体的
entityAspect.extraMetadata
属性

这看起来像是折磨吗?它被折磨着。OData要求实体(特别是etag)附带额外的信息,如果没有这些信息,服务器将无法更新或删除实体。我们必须将这些信息从您的头发中储存起来,然后在向服务器发出保存请求时将其带回。我们将其放在
entityAspect
上,以符合该属性作为“实体性”保管者的角色,该“实体性”与对象的业务目的无关,与对象的持久化方式有关

这就是为什么。臭虫在哪里

虫子 潜在的缺陷是,来自SharePoint OData源的此元数据已消失。我们还不知道它是怎么消失的。但是没有它我们会有大麻烦

缺少
外部元数据时,sharepoint适配器应提供更好的消息。实际上,我们会在几行之后寻找这个问题;请参阅调整更新删除请求

var extraMetadata = aspect.extraMetadata;
if (!extraMetadata) {
    throw new Error("Missing the extra metadata for an update/delete entity");
}
那项测试似乎太晚了。我会记下笔记,把考试提前

但这样的修复只会导致保存失败,并显示更好的消息。它不会告诉你如何修复它

因此,让我们努力寻找
\u元数据
消失的地方。。。首先是它是否曾经到达过

我等待你的报告

2014年7月17日更新 我仍在等待您是否在原始实体查询响应的有效负载中看到
\uuu metadata
属性

同时,我检查了OData规范(复数)中对
\uuu元数据
属性的引用。似乎
\u元数据
属性始终是可选的。因此,OData提供商不需要发送或遵守etag。。。我们知道这是可能的,因为WebAPI2OData不支持ETag。。。即将被纠正的缺陷

。搜索术语“元数据”

ODataV.3规范还在JSON响应(至少是JSON详细响应)中调用
\uuu元数据
属性

但是。。。沉重的叹息。。。似乎
\uuu metadata
属性已从v.4规范中删除,元数据信息完全通过JSON注释提供。DataJS库(许多但不是所有BreezeJS OData适配器都使用)可能会将这些注释映射到节点的
\uu元数据
属性中,但我还不能确认。我们需要做一些工作来应对所有这些变化

与此同时,我认为所有BreezeJS OData数据服务适配器都应该对额外的元数据采取更具防御性的立场,并且应该忽略遗漏,而不是抛出异常

我们很快就会做出这些防御性的改变

当然,如果OData服务实际需要etag或其他元数据,服务器将拒绝您的更新或删除请求。我不知道我们能做些什么
function visitNode(node, mappingContext, nodeContext)
return result;
result.extraMetadata = node.__metadata;
SP.Data.**mylistname**sListItem**  (notice the "sListItem" suffix; ;  Ex. SP.Data.CustomersListItem)
<ListInstance 
      Title="My Customers" 
      OnQuickLaunch="TRUE" 
      TemplateType="10000" 
      Url="Lists/Customers"    <!-- List/Customer will not work -->
      Description="My List Instance">
      ...
if (entityType._mappedPropertiesCount <= Object.keys(node).length - 1)
if (entityType.dataProperties.length <= Object.keys(node).length - 1)