CRM从2011升级到9.1后crmsvcutil执行SQL报错咨询
问题解答:CRM 9.1中crmsvcutil生成早期绑定代码失败问题
问题背景
上周将CRM组织从CRM 2011升级至CRM 9.1,使用crmsvcutil生成早期绑定代码时出现SQL错误,具体情况:
- 在CRM 2011环境中运行
crmsvcutil可正常执行; - 在升级后的CRM 9.1环境中运行失败,触发错误的SQL语句如下:
SELECT DISTINCT E.EntityId, R.RelationshipId, ERR.EntityRelationshipId, ERR.EntityRelationshipRelationshipsId, ERRole.EntityRelationshipRoleId, REC.ConditionId, ALV.AttributeLookupValueId, VA.ViewAttributeId FROM EntityView E INNER JOIN RelationshipView R ON R.ReferencingEntityId = E.EntityId OR R.ReferencedEntityId = E.EntityId INNER JOIN EntityRelationshipRelationshipsView ERR ON ERR.RelationshipId = R.RelationshipId INNER JOIN EntityRelationshipRoleView ERRole ON ERRole.EntityRelationshipId = ERR.EntityRelationshipId LEFT OUTER JOIN RelationshipExtraConditionView REC ON REC.RelationshipId = R.RelationshipId LEFT OUTER JOIN AttributeLookupValueView ALV ON ALV.AttributeId = R.ReferencingAttributeId OR ALV.AttributeId = R.ReferencedAttributeId LEFT OUTER JOIN ViewAttributeView VA ON VA.RelationshipId = R.RelationshipId WHERE E.Name LIKE 'new_reserveentity_rp53fd1p1ekxpa%'
当前组织中不存在名为reserveentity或rp53fd1p1ekxpa的表或实体,现针对以下两个问题解答:
问题1:crmsvcutil为何需要查询该关联关系?
crmsvcutil的核心作用是根据CRM系统的元数据生成早期绑定的实体类,这要求它必须遍历所有实体及其关联关系,以此生成实体类之间的导航属性、关联逻辑等代码。
你看到的SQL语句中,new_reserveentity_rp53fd1p1ekxpa应该是一个升级过程中残留的无效自定义实体名称。工具在扫描系统元数据时,错误地识别到了这个不存在的实体的残留元数据,进而尝试查询其关联关系,由于该实体实际不存在,导致查询返回空结果,最终触发报错。
问题2:为何该工具在CRM 2011环境中可正常运行?
主要有两方面原因:
- 元数据处理逻辑差异:CRM 2011的元数据存储和查询逻辑相对宽松,对于已删除或无效的实体元数据条目,系统会自动忽略,
crmsvcutil在扫描时不会强制校验这类残留记录的完整性; - 升级导致的元数据不一致:CRM 2011中可能已经删除了该实体,但升级到9.1的过程中,部分关联元数据(比如关联关系、视图绑定记录)残留在
EntityView、RelationshipView等系统视图中。而CRM 9.1版本的crmsvcutil对元数据的校验更严格,直接触发了这个隐藏的元数据异常。
额外解决建议
- 检查CRM系统的元数据视图(比如
EntityView、RelationshipView),手动清理包含new_reserveentity_rp53fd1p1ekxpa的残留记录; - 使用对应CRM 9.1版本的最新
crmsvcutil工具,新版本可能修复了这类元数据扫描的兼容性问题; - 通过CRM的Power Platform Admin Center检查是否存在无效实体,使用官方工具清理冗余元数据。
内容的提问来源于stack exchange,提问作者Arnaud M. Smadja
相关产品推荐
相关产品推荐

