Problem:
If you are trying to merge two accounts, If master account record does not have a parent account, but the subordinate account record does, then you will get following warning message if you do Merge from CRM UI otherwise if you do Merge from SDK code using MergeRequest class you will get an exception saying that “Exception Message: Merge warning: sub-entity might lose parenting”
Image may be NSFW.
Clik here to view.
Solution:
If you are doing Merge from CRM UI, after you get above warning message, click on “OK” button to continue the merge.
If you are doing Merge from SDK code using MergeRequest class, you should specify PerformParentingChecks property to false. This property used to check if the parent information is different for the two entity records. If it is true it will check the parent information is different for the two entity records.
Sample code is here:
// Merge Accounts public void MergeAccounts(Guid masterAccountId, Guid subOrdinateAccountId) { try { //Create CRM Connection IOrganizationService crmConnection = GetCRMConnection(); //Create the target for the request. EntityReference target = new EntityReference(); //Id is the GUID of the account that is being merged into. //LogicalName is the type of the entity being merged to, as a string target.Id = masterAccountId; target.LogicalName = "account"; //Create the request. MergeRequest merge = new MergeRequest(); // SubordinateId is the GUID of the account merging. merge.SubordinateId = subOrdinateAccountId; merge.Target = target; merge.PerformParentingChecks = false; Entity updateContent = new Entity("account"); var cols = new ColumnSet(new[] { "primarycontactid", "websiteurl", "telephone1", "fax", "emailaddress1" }); //Get Master Account Primary Contact,Website,Phone,Fax,Email var masterAccount = crmConnection.Retrieve("account", masterAccountId, cols); //Get Subordinate Account Primary Contact,Website,Phone,Fax,Email var subOrdinateAccount = crmConnection.Retrieve("account", subOrdinateAccountId, cols); //If PrimaryContact,Website,Phone,Fax,Email fields data are populated on the Subordinate Account and NOT populated on the Master Account. updated these Subordinate account values to the Master record. if (!masterAccount.Contains("primarycontactid") && subOrdinateAccount.Contains("primarycontactid")) updateContent.Attributes.Add("primarycontactid", new EntityReference("contact", subOrdinateAccount.GetAttributeValue<EntityReference>("primarycontactid").Id)); if (!masterAccount.Contains("websiteurl") && subOrdinateAccount.Contains("websiteurl")) updateContent.Attributes.Add("websiteurl", subOrdinateAccount.Attributes["websiteurl"]); if (!masterAccount.Contains("telephone1") && subOrdinateAccount.Contains("telephone1")) updateContent.Attributes.Add("telephone1", subOrdinateAccount.Attributes["telephone1"]); if (!masterAccount.Contains("fax") && subOrdinateAccount.Contains("fax")) updateContent.Attributes.Add("fax", subOrdinateAccount.Attributes["fax"]); if (!masterAccount.Contains("emailaddress1") && subOrdinateAccount.Contains("emailaddress1")) updateContent.Attributes.Add("emailaddress1", subOrdinateAccount.Attributes["emailaddress1"]); merge.UpdateContent = updateContent; // Execute the request. MergeResponse mergeRes = (MergeResponse)crmConnection.Execute(merge); } catch (Exception ex) { //Throw the exception throw ex; } }