Relating ChildParent records using External Id is throwing DML Error

apex

I am following this post to related parent child objects. Please review below code which I am testing but getting a DML error. I could not figure out the mistake I am doing. Any guidance will be appreciated.

Case caseRecord = [SELECT Subject, AccountId, ContactId, (SELECT Equipment__c, Quantity__c FROM Equipment_Maintenance_Items__r)
                    FROM Case
                    WHERE Id = '5008c00001J6GNdAAN'];

List<Equipment_Maintenance_Item__c> equipItems = new List<Equipment_Maintenance_Item__c>();

Case newCase = caseRecord.Clone(false, true);

newCase.ExternalId__c = 'test' + Datetime.now();

for (Equipment_Maintenance_Item__c equpItem: caseRecord.Equipment_Maintenance_Items__r)
{
    Equipment_Maintenance_Item__c newEquipItem = equpItem.Clone(false, true);
    newEquipItem.Maintenance_Request__r = new Case (ExternalId__c = newCase.ExternalId__c);
    equipItems.add(newEquipItem);
   // insert newEquipItem;
}

insert newCase;
upsert equipItems;
System.debug ('case Subject is: '+ newCase.Id);

Error:

FATAL_ERROR|System.DmlException: Upsert failed. First exception on row
0; first error: INVALID_FIELD, Cannot specify both an external ID
reference Maintenance_Request__r and a salesforce id,
Maintenance_Request__c: []

Full debug output:

16:36:17.213 Starting Execute Anonymous Apex

Compiled successfully.
Error: System.DmlException: Upsert failed. First exception on row 0; first error: INVALID_FIELD, Cannot specify both an external ID reference Maintenance_Request__r and a salesforce id, Maintenance_Request__c: []
Error: AnonymousBlock: line 20, column 1

54.0 APEX_CODE,DEBUG;APEX_PROFILING,INFO
Execute Anonymous: Case caseRecord = [SELECT Subject, AccountId, ContactId, (SELECT Equipment__c, Quantity__c FROM Equipment_Maintenance_Items__r)
Execute Anonymous:                     FROM Case
Execute Anonymous:                     WHERE Id = '5008c00001J6GNdAAN'];
Execute Anonymous: 
Execute Anonymous: List<Equipment_Maintenance_Item__c> equipItems = new List<Equipment_Maintenance_Item__c>();
Execute Anonymous: 
Execute Anonymous: Case newCase = caseRecord.Clone(false, true);
Execute Anonymous: 
Execute Anonymous: newCase.ExternalId__c = 'test' + Datetime.now();
Execute Anonymous: 
Execute Anonymous: for (Equipment_Maintenance_Item__c equpItem: caseRecord.Equipment_Maintenance_Items__r)
Execute Anonymous: {
Execute Anonymous:     Equipment_Maintenance_Item__c newEquipItem = equpItem.Clone(false, true);
Execute Anonymous:     newEquipItem.Maintenance_Request__r = new Case (ExternalId__c = newCase.ExternalId__c);
Execute Anonymous:     equipItems.add(newEquipItem);
Execute Anonymous:    // insert newEquipItem;
Execute Anonymous: }
Execute Anonymous: 
Execute Anonymous: insert newCase;
Execute Anonymous: upsert equipItems;
Execute Anonymous: System.debug ('case Subject is: '+ newCase.Id);
16:36:18.216 (216415381)|USER_INFO|[EXTERNAL]|0058c00000BtpT5|[email protected]|(GMT-04:00) Eastern Daylight Time (America/New_York)|GMT-04:00
16:36:18.216 (216443501)|EXECUTION_STARTED
16:36:18.216 (216451164)|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex
16:36:18.216 (312680957)|CODE_UNIT_STARTED|[EXTERNAL]|Workflow:Case
16:36:18.216 (333644379)|CODE_UNIT_FINISHED|Workflow:Case
16:36:18.216 (334442626)|CODE_UNIT_STARTED|[EXTERNAL]|SLA
16:36:18.216 (337417301)|CODE_UNIT_FINISHED|SLA
16:36:18.216 (343066459)|EXCEPTION_THROWN|[20]|System.DmlException: Upsert failed. First exception on row 0; first error: INVALID_FIELD, Cannot specify both an external ID reference Maintenance_Request__r and a salesforce id, Maintenance_Request__c: []
16:36:18.216 (343689681)|FATAL_ERROR|System.DmlException: Upsert failed. First exception on row 0; first error: INVALID_FIELD, Cannot specify both an external ID reference Maintenance_Request__r and a salesforce id, Maintenance_Request__c: []

AnonymousBlock: line 20, column 1
16:36:18.343 (343715083)|CUMULATIVE_LIMIT_USAGE
16:36:18.343 (343715083)|LIMIT_USAGE_FOR_NS|(default)|
  Number of SOQL queries: 1 out of 100
  Number of query rows: 5 out of 50000
  Number of SOSL queries: 0 out of 20
  Number of DML statements: 2 out of 150
  Number of Publish Immediate DML: 0 out of 150
  Number of DML rows: 5 out of 10000
  Maximum CPU time: 0 out of 10000
  Maximum heap size: 0 out of 6000000
  Number of callouts: 0 out of 100
  Number of Email Invocations: 0 out of 10
  Number of future calls: 0 out of 50
  Number of queueable jobs added to the queue: 0 out of 50
  Number of Mobile Apex push calls: 0 out of 10

16:36:18.343 (343715083)|CUMULATIVE_LIMIT_USAGE_END

16:36:18.216 (343774546)|CODE_UNIT_FINISHED|execute_anonymous_apex
16:36:18.216 (343782053)|EXECUTION_FINISHED

16:36:17.853 ended Execute Anonymous Apex

Best Answer

I resolved this error by creating new objects for Case and custom objects.

Instead of:

Case newCase = caseRecord.Clone(false, true);

Used:

Case newCase = new Case (*set fields* );

The clone() method is really messed up and should be avoided whenever possible, just an advice.