【问题标题】:Error: Not able to retrieve after create in plugin错误:在插件中创建后无法检索
【发布时间】:2018-11-01 20:25:27
【问题描述】:

我正在同步执行一个插件 postOperation。 我使用IOrganizationService.Create 创建了一个实体。这可行,我得到一个 GUID,我可以看到记录存在于 CRM 中。 在此之后,我尝试使用相同的 IOrganizationService 和 create 调用返回的 GUID 检索相同的记录:

public void Execute(IServiceProvider serviceProvider)
    {
        ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
        tracer.Trace("context is " + context.InputParameters["Target"]);
        context.OutputParameters["Message"] = "in plugin";

        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
        {
/* some other processing here
.
.
*/
 Guid polId = service.Create(policy);
               Entity polEntity = service.Retrieve("new_customEntiry", polId, new ColumnSet(true));

polEntity.Id 为空。 polEntity["someattribute"] 也是 null 。

为什么检索调用不起作用?我错过了什么?

相关帖子:Error Account with Id = "xxxxxx" does not exist

【问题讨论】:

  • 你能发布serviceFactory.CreateOrganizationService方法体吗?
  • 我不明白,你为什么要从数据库中检索它,而你刚刚创建它并且你已经拥有关于策略对象中记录的所有数据。什么是额外的??
  • 当你有一个包含 Guid 和所有其他信息的对象时,我同意@ArunVinoth,你不需要再次获取它。还要检查这里,你确定你使用的是正确的实体名称???在您获取之前,请尝试添加对 Guid.Empty 的 Guid polId 的检查。 Entity polEntity = service.Retrieve("new_customEntiry", polId, new ColumnSet(true));
  • 我想用这个实体更新一些其他记录中的查找字段。在此之前,我正在检查 create 方法返回的 guid 是否为 null(代码未包含在本文中)。更新调用导致以下错误:异常详细信息:错误代码:0x80040217 消息:带有 Id = a902fd34-f5dd-e811-a998-000d3a37d203 的 new_customEntity 不存在 @AnkUser
  • @dynamicallyCRM 我正在​​使用 Microsoft.Xrm.sdk 库

标签: c# plugins dynamics-crm dynamics-365


【解决方案1】:

我确信代码中存在您未分享的问题。

可能的根本原因

service.Create(policy)中用于策略对象的实体应与service.Retrieve中使用的new_customEntiry相同,检查它

建议

1.添加跟踪日志以在插件跟踪中记录polId或对其进行配置/调试以查看
2.尝试异步模式并测试相同的插件步骤
3.不要检索整个实体对象,而是这样做

Guid polId = service.Create(policy);

Entity toUpdate = new Entity("new_entityToUpdate", entityToUpdateId);
toUpdate["new_customEntiryId"] = new EntityReference("new_customEntiry", polId);
service.Update(toUpdate);

【讨论】:

  • 非常感谢阿伦!更改为异步工作。想知道有什么区别?为什么检索调用在同步模式下不起作用?创建调用后,我可以检索其他实体。
  • @jingle123 可能是因为数据库事务尚未完成,但试图检索在事务中创建的记录。
猜你喜欢
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多