Javascript 对与EntityType同名的资源的投影查询

Javascript 对与EntityType同名的资源的投影查询,javascript,breeze,Javascript,Breeze,在我们的项目中,我们正在服务器上执行投影查询。投影查询的资源名称与EntityType具有相同的名称。当我们收到结果时,Breeze试图将结果填充到EntityType中。在逐步浏览代码之后,我相信这会在visitAndMerge函数中发生 if (mappingContext.query && nodeContext.nodeType === "root" && !meta.entityType) { meta.entityType = mapp

在我们的项目中,我们正在服务器上执行投影查询。投影查询的资源名称与EntityType具有相同的名称。当我们收到结果时,Breeze试图将结果填充到EntityType中。在逐步浏览代码之后,我相信这会在
visitAndMerge
函数中发生

if (mappingContext.query && nodeContext.nodeType === "root" && !meta.entityType) {
        meta.entityType = mappingContext.query._getToEntityType &&
        mappingContext.query._getToEntityType(mappingContext.entityManager.metadataStore);
}

\u getToEntityType
最终调用了
\u getFromEntityType
,它将我们的资源与我们的EntityType相匹配。不太确定这是一个bug还是更多的Breeze规则,但我们认为我们会提出它,因为我们不想将资源名称与EntityType匹配。

在执行查询之前,Breeze使用资源名称/实体类型名称映射来解析类型信息。在使用实体框架后端时,使用EntitySet名称作为资源名称自动更新此映射。此类型信息用于验证和构造查询url

您也可以直接更新此地图。单个entityType可以有任意数量的资源名称与其关联

从服务器返回数据后,Breeze将尝试按照以下顺序提取entityType信息:(我们确实需要更好地记录这一点)

首先,它检查返回的json负载,并使用JsonResultsAdapter确定返回的任何实体的类型。当检索多个类型的实体的图或查询涉及继承的子类型时,这一点很重要。您可以为任何查询插入自己的JsonResultsAdapter

如果在上一步中未解析任何实体类型,则Breeze将使用任何EntityQuery.toType方法调用中指定的entityType

如果上一步没有解析entityType,并且查询不是投影,即使用select语句,那么上面提到的映射将基于查询中指定的初始资源名称进行查询

希望这有帮助