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)