Odata Breeze在按实体类型名称查询时忽略resourcename

Odata Breeze在按实体类型名称查询时忽略resourcename,odata,breeze,sharepoint-2013,Odata,Breeze,Sharepoint 2013,我有许多实体类型使用相同的ResourceName,但在dataProperties字段和使用“ContentTypeId”的查询where子句中不同(请参见下面的代码) 在列出的最后一个函数(GetRespondenceDocuments)中,如果我在from子句中使用实体类型名称“通信”,Breeze将忽略提供的defaultResourceName值,并使用实体类型名称作为resourcename字符串构造OData查询: /_api/对应关系?$filter=ContentTypeId%

我有许多实体类型使用相同的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'&


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;
    });
}