2016-05-17 31 views
3

嗨StackOverflow的社区设置的值,的Microsoft Dynamics CRM - 错误信息:实体ID必须相同属性包

我只是尝试复制的“接触”的记录 - 从一个插件或自定义实体工作流活动。 相关的代码是

  QueryExpression qe = new QueryExpression("contact") 
      { 
       ColumnSet = new ColumnSet("firstname", "lastname") 
      }; 
      EntityCollection entityCollection = _organizationService.RetrieveMultiple(qe); 
      foreach (Entity entity in entityCollection.Entities) 
      { 
       entity.Id = Guid.NewGuid(); 

       if (!entity.Attributes.Contains("firstname")) 
       { 
        entity.Attributes.Add("firstname", ""); 
       } 
       entity["firstname"] = (entity.GetAttributeValue<string>("firstname") ?? "") + "(Copy)"; 

       _organizationService.Create(entity); 
      } 

不幸的是,我总是得到错误信息

“实体ID必须相同属性包设置的值”。

如果我离开了

Entity.Id = Guid.NewGuid(); 

然后我得到的错误

行“无法插入重复键。”

我也尝试过各种其他的方式来建立一个新的GUID,包括

byte [] bytes = new byte[16]; 
random.NextBytes(bytes); 
entity.Id = new Guid(bytes); 

entity.Id = Guid.Empty; 

由此而来也

“实体ID必须是一样的值集在财产袋“。

另一方面,我有一个桌面应用程序,通过这篇文章https://msdn.microsoft.com/en-us/library/jj602970.aspx的帮助连接到我的Microsoft CRM 2016 Office 365系统,并且可以复制记录。

任何帮助,非常感谢。

+0

我想你在Microsoft Dynamics CRM中创建一个插件,你需要注册一个插件来创建,更新等,而不需要_organizationService.Create(entity); 。 –

回答

6

QueryExpression始终返回该ID,两者均为实际的Entity.Id,它的属性名称为contactid。这就是你遇到错误的原因。您可以删除此属性,但最佳做法是始终创建新的C#Contact对象,而不是更新从CRM中检索的对象。另外,您不希望设置自己的GUID,因为CRM使用更好地进行索引和排序优化的顺序GUID。

QueryExpression qe = new QueryExpression("contact") 
{ 
    ColumnSet = new ColumnSet("firstname", "lastname") 
}; 

foreach (Entity entity in _organizationService.RetrieveMultiple(qe).Entities) 
{ 
    var copy = new Entity(); 
    copy["firstname'] = (entity.GetAttributeValue<string>("firstname") ?? "") + "(Copy)"; 
    _organizationService.Create(copy); 
} 
+0

非常感谢。这种解决方案适用于我。我也尝试过entity.Attributes.Remove(entity.LogicalName +“id”),但没有完成这项工作。 – user172501

相关问题