.NET Framework对接Dynamics 365:Incident实体CRUD代码修复咨询
问题:Dynamics 365 Incident实体CRUD操作代码补充
我已经开发了对接Microsoft Dynamics 365的.NET Framework API,需要对包含关联Account实体的Customer字段的Incident实体执行CRUD操作。现有如下SaveIncident方法代码,请问需补充哪些内容才能让代码正常运行?
public void SaveIncident(IncidentEntityModels objIncidentModel) { using (OrganizationService service = new OrganizationService("MyConnectionString")) { QueryExpression query = new QueryExpression { EntityName = "account", ColumnSet = new ColumnSet("accountid", "name") }; List<EntityReference> info = new List<EntityReference>() ; EntityCollection Client = service.RetrieveMultiple(query); if (Client != null && Client.Entities.Count > 0) { EntityReference itm; for (int i = 0; i < Client.Entities.Count; i++) { itm = new EntityReference(); if (Client[i].Id != null) itm.Id = Client[i].Id; if (Client[i].Contains("name") && Client[i]["name"] != null) itm.Name = Client[i]["name"].ToString(); itm.LogicalName = "account"; info.Add(itm); } } Entity IncidentEntity = new Entity("incident"); if (objIncidentModel.IncidentID != Guid.Empty) { IncidentEntity["incidentid"] = objIncidentModel.IncidentID; } IncidentEntity["title"] = objIncidentModel.TitreIncident; IncidentEntity["customerid"] = info; IncidentEntity["description"] = objIncidentModel.Description; if (objIncidentModel.IncidentID == Guid.Empty) { objIncidentModel.IncidentID = service.Create(IncidentEntity); } else { service.Update(IncidentEntity); } } }
需要补充/修改的内容
1. 修正CustomerId字段赋值错误
Incident实体的customerid是单个EntityReference类型(一个工单只能关联一个客户),但当前代码给它赋值了List<EntityReference>,这会直接触发API报错。
- 解决方案:从传入的
objIncidentModel中添加AccountID属性(用于接收要关联的客户ID),然后构建单个EntityReference赋值:if (objIncidentModel.AccountID != Guid.Empty) { IncidentEntity["customerid"] = new EntityReference("account", objIncidentModel.AccountID); }
2. 删除不必要的Account全量查询
当前代码查询所有Account实体完全冗余,既浪费性能又不符合业务逻辑(工单应关联指定客户,而非所有客户),直接删除这段查询代码即可。
3. 补充模型属性与空值校验
- 在
IncidentEntityModels类中新增AccountID属性,用于传递关联的客户ID; - 对模型的关键属性(如
TitreIncident)做空值检查,避免传入无效值导致Dynamics 365报错:if (objIncidentModel == null) throw new ArgumentNullException(nameof(objIncidentModel)); if (string.IsNullOrWhiteSpace(objIncidentModel.TitreIncident)) throw new ArgumentException("工单标题不能为空", nameof(objIncidentModel.TitreIncident));
4. 修正OrganizationService实例化方式
标准的Dynamics 365服务实例化应使用CrmServiceClient而非直接new OrganizationService,同时需检查服务连接状态:
using (var service = new CrmServiceClient("MyConnectionString")) { if (!service.IsReady) throw new InvalidOperationException("无法连接到Dynamics 365服务"); // 后续业务逻辑 }
5. 补充异常处理
添加针对Dynamics 365服务异常的捕获与处理,便于排查问题:
try { // 服务操作逻辑 } catch (FaultException<OrganizationServiceFault> ex) { throw new InvalidOperationException("Dynamics 365工单操作失败", ex); } catch (Exception ex) { throw new InvalidOperationException("保存工单时发生错误", ex); }
6. 修正实体ID设置方式
设置Incident实体ID时,应直接赋值Entity.Id属性,而非incidentid字段:
if (objIncidentModel.IncidentID != Guid.Empty) { IncidentEntity.Id = objIncidentModel.IncidentID; }
修改后的完整代码示例
public void SaveIncident(IncidentEntityModels objIncidentModel) { // 模型与属性校验 if (objIncidentModel == null) throw new ArgumentNullException(nameof(objIncidentModel)); if (string.IsNullOrWhiteSpace(objIncidentModel.TitreIncident)) throw new ArgumentException("工单标题不能为空", nameof(objIncidentModel.TitreIncident)); try { // 实例化Dynamics 365服务 using (var service = new CrmServiceClient("MyConnectionString")) { if (!service.IsReady) throw new InvalidOperationException("无法连接到Dynamics 365服务"); Entity incidentEntity = new Entity("incident"); // 设置工单ID(编辑场景) if (objIncidentModel.IncidentID != Guid.Empty) { incidentEntity.Id = objIncidentModel.IncidentID; } // 赋值基础字段 incidentEntity["title"] = objIncidentModel.TitreIncident; incidentEntity["description"] = objIncidentModel.Description; // 关联指定Account if (objIncidentModel.AccountID != Guid.Empty) { incidentEntity["customerid"] = new EntityReference("account", objIncidentModel.AccountID); } // 执行创建/更新操作 if (objIncidentModel.IncidentID == Guid.Empty) { objIncidentModel.IncidentID = service.Create(incidentEntity); } else { service.Update(incidentEntity); } } } catch (FaultException<OrganizationServiceFault> ex) { throw new InvalidOperationException("Dynamics 365工单操作失败", ex); } catch (Exception ex) { throw new InvalidOperationException("保存工单时发生错误", ex); } } // 补充后的实体模型类 public class IncidentEntityModels { public Guid IncidentID { get; set; } public string TitreIncident { get; set; } public string Description { get; set; } public Guid AccountID { get; set; } // 新增:关联Account的ID }
内容的提问来源于stack exchange,提问作者Programming Lover
相关产品推荐
相关产品推荐

