You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:43