按实体类型名称查询时,Breeze会忽略resourcename

时间:2014-08-26 21:28:23

标签: odata breeze sharepoint-2013

我有许多使用相同ResourceNames但在dataProperties字段中不同的实体类型,并使用'ContentTypeId'查询 where 子句(请参阅下面的代码)。

在所列的(getCorrespondenceDocuments)的最后一个函数,如果我在使用实体类型名称“对应”的子句,微风忽略提供的defaultResourceName值,并使用实体类型名称构造的OData查询作为resourcename字符串:

/ _ AP​​I /的对应 $滤波器= ContentTypeId%20当量%20'0x01 ... 22' 和; $选择= ID%2CTitle%2CContentTypeId%2CCreated%2CModified%2CCorrespondenceType% 2CCorrespondenceDate%2CCorrespondenceAuthor%2CCorrespondenceRecipient%2CCorrespondenceTopic%2CConfidentialFlag%2CFile&安培;

如果我使用在defaultResourceName的子句,微风将使用默认的文件实体和正确的资源名称的字符串构成的OData请求,但它不包括正确的dataProperties字段:

/ _ AP​​I /的 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')方法进行上一次测试。根本不会返回任何字段:

/ _ AP​​I / 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;
    });
}

2 个答案:

答案 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 方法:

http://www.breezejs.com/sites/all/apidocs/classes/MetadataStore.html#method_setEntityTypeForResourceName

另请参阅http://www.breezejs.com/documentation/querying-locally

下的“EntityType / ResourceName地图”部分