在我们的项目中,我们正在服务器上执行投影查询。投影查询的资源名称与EntityType具有相同的名称。当我们收到结果时,Breeze试图将我们的结果填充到EntityType中。单步执行代码后,我相信这会发生在visitAndMerge
函数中。
if (mappingContext.query && nodeContext.nodeType === "root" && !meta.entityType) {
meta.entityType = mappingContext.query._getToEntityType &&
mappingContext.query._getToEntityType(mappingContext.entityManager.metadataStore);
}
_getToEntityType
最终调用_getFromEntityType
,它将我们的资源与我们的EntityType匹配。不太确定这是否是一个错误或更多的Breeze规则,但我们认为我们会提出它,因为我们有一个案例,我们不希望将资源名称与EntityType匹配。
答案 0 :(得分:0)
在执行查询之前,Breeze使用资源名称/实体类型名称映射来解析类型信息。使用Entity Framework后端时,使用EntitySet名称作为资源名称自动更新此映射。此类型信息用于验证和构造查询URL。
您也可以直接更新此地图See Api Docs - setEntityTypeForResourceName。单个entityType可以包含与之关联的任意数量的资源名称
从服务器返回数据后,Breeze会尝试按照以下顺序提取entityType信息:(我们需要更好地记录这一点)。
首先,它检查返回的json有效负载,并使用 JsonResultsAdapter 来确定返回的任何实体的类型。在检索多个类型的实体的图形或涉及继承的子类型的查询时,这很重要。您可以插入自己的 JsonResultsAdapter 以进行任何查询。
如果在前一步骤中没有解析任何实体类型,则Breeze将使用在任何 EntityQuery.toType 方法调用中指定的任何entityType。
如果上一步未解析entityType且查询不是投影,即使用select语句,则上述地图将根据查询中指定的初始资源名称进行咨询。
希望这有帮助。