C# Id为“”的错误帐户;xxxxxx“;不存在

C# Id为“”的错误帐户;xxxxxx“;不存在,c#,dynamics-crm,dynamics-crm-online,dynamics-crm-365,C#,Dynamics Crm,Dynamics Crm Online,Dynamics Crm 365,我有一个创建帐户和商机的客户工作流程 有时我会出现以下错误:Id为“xxxxxx”的帐户不存在 如果知道我在CRM中找到了帐户,我不知道我的代码有什么问题。 以下是我的插件代码的步骤: 按num查找帐户(如果不存在,则创建帐户) 获取帐户=帐户 创建一个opportunity[“parentaccountid”]=Account的opportunity 错误信息 代码: //获得机会 Guid id=retrieveOpportunity(“opportunity”、“new_numero”、n

我有一个创建帐户和商机的客户工作流程

有时我会出现以下错误:Id为“xxxxxx”的帐户不存在

如果知道我在CRM中找到了帐户,我不知道我的代码有什么问题。
以下是我的插件代码的步骤:

  • 按num查找帐户(如果不存在,则创建帐户)
  • 获取帐户=帐户
  • 创建一个opportunity[“parentaccountid”]=Account的opportunity
  • 错误信息 代码:

    //获得机会
    Guid id=retrieveOpportunity(“opportunity”、“new_numero”、numero、service);
    实体机会;
    if(id!=Guid.Empty)
    {
    eOpportunity=新实体(“机会”,id);
    }
    其他的
    {
    eOpportunity=新实体(“机会”);
    }
    //算帐
    EntityReference eAccount=retrieveAccount(accountCode,“account”,“new_code”,service);
    if(eAccount==null)
    {
    eAccount=新实体(“账户”、“新代码”、账户代码);
    eAccount[“name”]=“name”;
    UpsertRequest usMessage=新的UpsertRequest()
    {
    目标=eAccount
    };
    //创建帐户
    UpsertResponse usResponse=(UpsertResponse)this.\u service.Execute(usMessage);
    eOpportunity[“parentaccountid”]=usResponse.Target;
    }
    其他的
    {
    eOpportunity[“parentaccountid”]=eAccount;
    }
    UpsertRequest req=新的UpsertRequest()
    {
    目标=机会
    }; 
    //抢机会
    UpsertResponse resp=(UpsertResponse)服务执行(req);
    如果(分别创建记录)
    tracer.Trace(“新机遇”);
    其他的
    tracer.Trace(“机会更新”);
    

    有时会有多个工作流同时启动并执行相同的操作(创建其他机会)

    您没有向我们展示整个插件,因此这只是一个猜测,但您可能在类级别共享您的IOrganizationService,这会在代码中造成争用条件,一个线程在不同的上下文中创建一个新帐户,然后它的服务被另一个线程覆盖,而另一个线程位于不同的数据库事务中,该事务没有新创建的帐户,并且它出错


    不要跨线程共享IOrganziationService

    当您试图在同一事务中使用创建的记录时,请将插件转换为异步模式-这将起作用。

    向我们显示实际代码而不是伪代码:)