Here we will be cloning the below contact record –
For it, we can make use Clone method of EntityExtensions class
If we run the below code, we will get the “Cannot insert duplicate key” exception.
Because we need to set the ID for the newly cloned record to either empty or a new GUID.
Also, we need to remove the contactid attribute or entity’s id field else we will get the below exception – “Entity Id must be the same as the value set in property bag“
Also if we are retrieving all the attributes we need to make sure we remove those attribute which can cause below unique constraint errors.
Sql error: The operation attempted to insert a duplicate value for an attribute with a unique constraint. CRM ErrorCode: -2147012606 Sql ErrorCode: -2146232060 Sql Number: 2627
In case of contact, we had to remove the address id attributes, to get the record cloned.
Now let us clone the same contact record with its related leads.
- Here first we need to retrieve contact along with its associated lead record.
- Then remove the id attribute that could duplicate issues in the child lead records also.
Please refer the helpful posts –
https://debajmecrm.com/clone-record-dynamics-crm-clone-method/
https://www.inogic.com/blog/2014/08/clone-records-in-dynamics-crm/
https://dynamict.eu/2016/08/09/create-record-with-related-records-in-a-single-request-using-c/
Hope it helps..
// related lead records of contact
QueryExpression query = new QueryExpression("lead");
query.ColumnSet = new ColumnSet(true);
// contact and lead - 1 - n relationship
Relationship relationship = new Relationship("lead_parent_contact");
relationship.PrimaryEntityRole = EntityRole.Referenced;
RelationshipQueryCollection relatedEntity = new RelationshipQueryCollection();
relatedEntity.Add(relationship, query);
RetrieveRequest request = new RetrieveRequest();
request.RelatedEntitiesQuery = relatedEntity;
request.ColumnSet = new ColumnSet(true);
request.Target = new EntityReference("contact", new Guid("ca0aa844-57c6-ec11-a7b6-00224826af1e"));
RetrieveResponse response = (RetrieveResponse)svc.Execute(request);
var contactToBeCloned = response.Entity;
var clonedContact = contactToBeCloned.Clone(true);
// remove attribute that can cause error from main entity
clonedContact.Id = Guid.NewGuid();
clonedContact.Attributes.Remove("contactid");
clonedContact.Attributes.Remove("address1_addressid");
clonedContact.Attributes.Remove("address2_addressid");
clonedContact.Attributes.Remove("address3_addressid");
// remove attribute that can cause error from child / related entities
foreach (var relatedEntities in clonedContact.RelatedEntities)
{
foreach(var leadEntity in relatedEntities.Value.Entities)
{
leadEntity.Id = Guid.NewGuid();
leadEntity.Attributes.Remove("leadid");
leadEntity.Attributes.Remove("address1_addressid");
leadEntity.Attributes.Remove("address2_addressid");
}
}
svc.Create(clonedContact);
Awesome Blog. Very insighful and useful. Thank Man!
One question: The latest version of Microsoft.Xrm.Client assembly available is v7. I was able to build the plugin assembly and register to plugin registration tool. But i am getting error in the backend saying “Couldn’t load file or assembly MS.Xrm.Client v7.0.0.0”. I added the assembly and build was also successful. I also have latest Nuget package core assemblies and .NET framework 4.6.2.
Please advise!
LikeLike