Odata Breeze在按实体类型名称查询时忽略resourcename
我有许多实体类型使用相同的ResourceName,但在dataProperties字段和使用“ContentTypeId”的查询where子句中不同(请参见下面的代码) 在列出的最后一个函数(GetRespondenceDocuments)中,如果我在from子句中使用实体类型名称“通信”,Breeze将忽略提供的defaultResourceName值,并使用实体类型名称作为resourcename字符串构造OData查询: /_api/对应关系?$filter=ContentTypeId%20eq%20'0x01…22'和$select=Id%2CTitle%2CContentTypeId%2CCreated%2CModified%2C对应关系类型%2C对应关系日期%2C对应关系作者%2C对应关系主题%2C机密标志%2CFile& 如果我在from子句中使用defaultResourceName,Breeze将使用默认文档实体和正确的resourcename字符串构造OData请求,但它不包括正确的dataProperties字段: /_api/SP.AppContextSite(@target)/web/lists/getByTitle('Documents')/items?@target=''&$expand=File&$filter=ContentTypeId%20eq%20'0x01…22'&$select=Id%2CTitle%2CContentTypeId%2CCreated%2CModified%2CFile%2csecretentialFlag& 在上一次测试中,我还尝试了使用.toType('correlationship')方法。完全不返回任何字段: /_api/SP.AppContextSite(@target)/web/lists/getByTitle('Documents')/items?@target=''&$expand=File&$filter=ContentTypeId%20eq%20'0x01…22'&Odata Breeze在按实体类型名称查询时忽略resourcename,odata,breeze,sharepoint-2013,Odata,Breeze,Sharepoint 2013,我有许多实体类型使用相同的ResourceName,但在dataProperties字段和使用“ContentTypeId”的查询where子句中不同(请参见下面的代码) 在列出的最后一个函数(GetRespondenceDocuments)中,如果我在from子句中使用实体类型名称“通信”,Breeze将忽略提供的defaultResourceName值,并使用实体类型名称作为resourcename字符串构造OData查询: /_api/对应关系?$filter=ContentTypeId%
Breeze似乎假设每个实体类型的资源名称都不同 如何告诉Breeze使用正确的实体数据属性和资源名称
您可以使用MetadataStore.setEntityTypeForResourceName方法:
另请参见“EntityType/ResourceName映射”部分,该部分位于是,Breeze通常假定给定端点每次都返回相同的类型。我有点惊讶,在执行查询之前将
.toType
附加到查询中对您不起作用。也许我不应该感到惊讶;我已经有一段时间没有参与代码库的这一部分了
我想我应该通过JsonResultsAdapter.visitNode
方法进行调试,开始诊断这种情况,并密切关注updateEntityNode
helper函数。在确定result.entityType
的值时,它不知何故会感到困惑,即使您将添加到type
如果必须修复JsonResultsAdapter.visitNode中的类型确定,则应该寻找一种基于节点和上下文消除歧义的方法。一种明显的(可能是黑客式的)方法是查找node.respondenceType`属性的存在
在确定查询的目标是这个不明确的端点之后,可以这样做。mappingContext
参数到visitNode
方法可以告诉您所查询的端点;请参见mappingContext.query.resourceName
您可以完全访问此处的查询,因此可能还有另一个“信号装置”可以提供帮助。例如,在执行查询之前将.toType('foo')
子句添加到查询中时,mappingContext.query.resulttentytype
是指定类型的名称(例如,“foo”)。这是一个非常好的线索,你不认为吗?MetadataStore.setEntityTypeForResourceName与我需要的正好相反。在文档页面:“只有在多个资源返回相同entityType的情况下才需要此方法。”我需要从单个资源中获得多个entityType。
// Document type (default document type)
function addDocumentType() {
addType({
name: 'Document'
, defaultResourceName: 'SP.AppContextSite(@target)/web/lists/getByTitle(\'Documents\')/items?@target=\'' + spContext.hostWeb.url + '\'&$expand=File'
, dataProperties: {
Id: { type: breeze.DataType.Int32 }
, Title: { nullable: true }
, ContentTypeId: {}
, Created: { type: breeze.DataType.DateTime }
, Modified: { type: breeze.DataType.DateTime }
, File: { complexType: 'Document:#File' }
, ConfidentialFlag: { type: breeze.DataType.boolean, nullable: true }
}
});
}
// Correspondence type
function addCorrespondenceType() {
addType({
name: 'Correspondence'
, defaultResourceName: 'SP.AppContextSite(@target)/web/lists/getByTitle(\'Documents\')/items?@target=\'' + spContext.hostWeb.url + '\'&$expand=File'
, dataProperties: {
Id: { type: breeze.DataType.Int32 }
, Title: { nullable: true }
, ContentTypeId: {}
, Created: { type: breeze.DataType.DateTime }
, Modified: { type: breeze.DataType.DateTime }
, CorrespondenceType: { nullable: true }
, CorrespondenceDate: { type: breeze.DataType.DateTime, nullable: true }
, CorrespondenceAuthor: { nullable: true }
, CorrespondenceRecipient: { nullable: true }
, CorrespondenceTopic: { nullable: true }
, ConfidentialFlag: { type: breeze.DataType.boolean, nullable: true }
, File: { complexType: 'Document:#File' }
}
});
}
function getDefaultDocuments(page) {
return breeze.EntityQuery
.from(documentType.defaultResourceName)
.orderBy('Id')
.skip(pageSize * (page - 1))
.take(pageSize)
.using(manager)
.execute()
.then(function (data) {
return data.results;
});
}
function getCorrespondenceDocuments() {
return breeze.EntityQuery
.from('Correspondence')
//.from(correspondenceType.defaultResourceName)
.where('ContentTypeId', 'eq', breeze.config.contentTypeIds.correspondence)
.using(manager)
.execute()
.then(function (data) {
return data.results;
});
}