使用C# SDK查询Dynamics 365产品信息遇实体未找到问题
问题解决指南
核心问题原因
报错提示找不到product实体,主要有两个可能:
- 你的Dynamics 365环境未启用产品目录功能,导致
product实体未在系统中注册。 - 当前使用的
IOrganizationService用户没有product实体的读取权限,元数据查询时无法获取该实体信息。
验证与解决步骤
1. 确认产品目录功能是否启用
进入Dynamics 365后台:
- 路径:设置 → 销售 → 产品目录
- 若无法访问或提示功能未启用,联系管理员启用产品目录模块,系统会自动加载
product及关联定价实体。
2. 检查用户权限
- 进入设置 → 安全 → 安全角色,找到当前用户所属的角色
- 在「实体权限」列表中找到「产品」,确保已分配读取权限,必要时添加「写入」「删除」等权限
- 保存角色后重新测试查询
3. 修正查询代码(含定价信息获取)
Dynamics 365中产品的定价信息存储在productpricelevel(产品价格)实体中,该实体关联product(产品)和pricelevel(价格列表)。以下是完整的查询示例:
// 1. 根据产品编号查询产品 var productCols = new ColumnSet("name", "productnumber", "productid"); var productQuery = new QueryByAttribute("product") { ColumnSet = productCols, Attributes = { "productnumber" }, Values = { "100002" } }; var productResults = service.RetrieveMultiple(productQuery); if (productResults?.Entities.Any() == true) { var product = productResults.Entities.First(); Console.WriteLine($"产品名称:{product.GetAttributeValue<string>("name")}"); // 2. 查询该产品关联的定价信息 var priceCols = new ColumnSet("amount", "pricelevelid", "uomid"); var priceQuery = new QueryByAttribute("productpricelevel") { ColumnSet = priceCols, Attributes = { "productid" }, Values = { product.Id } }; var priceResults = service.RetrieveMultiple(priceQuery); foreach (var priceItem in priceResults.Entities) { // 获取价格列表名称 var priceLevelRef = priceItem.GetAttributeValue<EntityReference>("pricelevelid"); var priceLevel = service.Retrieve("pricelevel", priceLevelRef.Id, new ColumnSet("name")); // 获取单价和单位 var unitPrice = priceItem.GetAttributeValue<Money>("amount").Value; var uomRef = priceItem.GetAttributeValue<EntityReference>("uomid"); var uom = service.Retrieve("uom", uomRef.Id, new ColumnSet("name")); Console.WriteLine($"价格列表:{priceLevel.GetAttributeValue<string>("name")},单价:{unitPrice},单位:{uom.GetAttributeValue<string>("name")}"); } }
4. 修正元数据查询代码
若要确认product实体是否存在,可修改元数据查询的EntityFilters参数,获取更完整的实体信息:
public static EntityMetadata[] GetEntities(IOrganizationService organizationService) { var metaDataRequest = new RetrieveAllEntitiesRequest { // 获取实体及属性信息,确保不会遗漏已启用的实体 EntityFilters = EntityFilters.Entity | EntityFilters.Attributes, RetrieveAsIfPublished = true }; var metaDataResponse = (RetrieveAllEntitiesResponse)organizationService.Execute(metaDataRequest); return metaDataResponse.EntityMetadata; }
内容的提问来源于stack exchange,提问作者Jurgen Cuschieri
相关产品推荐
相关产品推荐

