我有许多使用相同ResourceNames但在dataProperties字段中不同的实体类型,并使用'ContentTypeId'查询 where 子句(请参阅下面的代码)。
在所列的(getCorrespondenceDocuments)的最后一个函数,如果我在使用实体类型名称“对应”的从子句,微风忽略提供的defaultResourceName值,并使用实体类型名称构造的OData查询作为resourcename字符串:
/ _ API /的对应 $滤波器= ContentTypeId%20当量%20'0x01 ... 22' 和; $选择= ID%2CTitle%2CContentTypeId%2CCreated%2CModified%2CCorrespondenceType% 2CCorrespondenceDate%2CCorrespondenceAuthor%2CCorrespondenceRecipient%2CCorrespondenceTopic%2CConfidentialFlag%2CFile&安培;
如果我使用在defaultResourceName的从子句,微风将使用默认的文件实体和正确的资源名称的字符串构成的OData请求,但它不包括正确的dataProperties字段:
?/ _ API /的 SP.AppContextSite(@target)/网络/列表/ getByTitle( '文件')/项目@target = 'http://my.spserver.com/dev/JDP' &安培; $扩大=文件< /强>&安培; $滤波器= ContentTypeId%20当量%20'0x01 ... 22' 和; $选择= ID%2CTitle%2CContentTypeId%2CCreated%2CModified%2CFile%2CConfidentialFlag&安培;
我还尝试使用 .toType('Correspondence')方法进行上一次测试。根本不会返回任何字段:
?/ _ API / SP.AppContextSite(@target)/网络/列表/ getByTitle( '文件')/项目@target = 'http://my.spserver.com/dev/JDP' &安培; $扩大=文件&安培; $滤波器= ContentTypeId%20当量%20'0x01 ... 22' 和;
似乎Breeze假设您的资源名称对于每种实体类型都不同。
如何告诉Breeze使用正确的实体数据属性和资源名称?
// 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;
});
}
答案 0 :(得分:1)
是的,Breeze通常假定给定的端点每次都返回相同的类型。我有点惊讶的是,在执行查询之前将.toType
附加到查询中并不适合您。也许我不应该感到惊讶;自从我在代码库的这一部分的最后一段时间以来已经有一段时间了。
我想我会通过调试JsonResultsAdapter.visitNode
方法开始诊断这种情况,并密切关注updateEntityNode
辅助函数。不知何故,在确定result.entityType
的价值时会感到困惑,即使您追加.toType
也是如此。
如果必须在JsonResultsAdapter.visitNode, you should be looking for a way to disambiguate based on node and context. One obvious (perhaps hacky) way is to look for the existence of a
node.CorrespondenceType`属性中修复类型确定。
您可以在之后执行,确保查询针对此模糊端点。 mappingContext
方法的visitNode
参数可以告诉您查询的端点;见mappingContext.query.resourceName
。
您可以完全访问此处的查询,也许还有另一个&#34; telltale&#34;这可以帮助。例如,在执行查询之前向查询添加.toType('foo')
子句时,mappingContext.query.resultEntityType
是您指定类型的名称(例如,&#39; foo&#39;)。这是一个很好的线索,你不觉得吗?
答案 1 :(得分:0)
您可以使用 MetadataStore.setEntityTypeForResourceName 方法:
下的“EntityType / ResourceName地图”部分