4
 @AuraEnabled(cacheable=true)
public static String  deleteContacts(List<String> contactIds) {
    List<Contact> returnList = new List<Contact> ();
    String query = ' SELECT Id,Name, LastName,Department,MobilePhone, Email FROM Contact WHERE id IN : contactIds ';
    for (Contact thisContact:  Database.Query(query)) {
         returnList.add(thisContact);
    }
    try {
      delete returnList;
      return'deleted successfully';
    }
    catch(Exception ex){
       return 'Problem occoured';
    }

}

JS Method
deleteSelected(){
    deleteContacts({
        contactIds :this.selectedIds
    }) 
    .then(result => {
        this.dispatchEvent(
            new ShowToastEvent({
                title: 'Success',
                message: result,
                variant: 'success',
            }),
        );
        return refreshApex(this.getContactList, { searchKeyWord: '$searchKeyWord' });
    })
    .catch(error => {
        this.error = error;
    });
11

Simply remove the (cacheable=true) parameter from your @AuraEnabled annotation. Caching a delete operation does not make any sense, and is not allowed.


If you read Lightning Components Best Practices: Caching Data with Storable Actions, you will note this section:

The general guideline is to cache (mark as storable) any action that is idempotent and non-mutating.

An idempotent action is an action that produces the same result when called multiple times. For example:

  • getPage(1) is idempotent and should be cached
  • getNextPage() is not idempotent and should not be cached

A non-mutating action is an action that doesn’t modify data. Never cache an action that can create, update, or delete data. For example:

  • updateAccount(sObject) is mutating and not idempotent and should not be cached

Your method violates the non-mutating constraint. It looks like this constraint is a must, rather than a should.

  • Thanks Adrian. Wow salesforce has the least useful error messages on the planet :) – Mr. B Sep 10 at 21:42
6

Reason for that is your

cacheable=true

annotation. When you are doing caching you cannot mutate any data. You can only get data. So thats why no DML operation is allowed i.e Total DML operation allowed are 0.

As given in this doc.

https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/controllers_server_apex_auraenabled_annotation.htm

To improve runtime performance, set @AuraEnabled(cacheable=true) to cache the method results on the client. To set cacheable=true, a method must only get data, it can’t mutate data.

5

You're performing DML in a context that is not supposed to mutate data - a cacheable @AuraEnabled method:

To improve runtime performance, set @AuraEnabled(cacheable=true) to cache the method results on the client. To set cacheable=true, a method must only get data, it can’t mutate data.

This code doesn't actually make sense, though. Why do you have a method called deleteContacts() that doesn't delete anything? The update DML it performs does nothing save to ping the audit fields, so it's not clear whether the correct approach is to remove the annotation, refactor the DML, or something else.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.