In the doc page for Lookup fields, under Creating a List Relationship, there is a box describing reasons that enforcing relationship behavior may fail:
In addition, setting a relationship behavior fails if:
The lookup field allows multiple values.
Before setting the RelationshipDeleteBehavior property, be sure
that the AllowMultipleValues property returns false.
Existing list items contain invalid values for the lookup field.
This can occur if the lookup field's RelationshipDeleteBehavior
property was previously set to None and someone deleted the item on
the target list that the lookup field points to. The lookup field is
thus orphaned; it contains an invalid value. A relationship behavior
cannot be enforced if the list contains orphaned lookup fields.
The lookup field points to a list in another website.
Check the value of the lookup field's LookupWebId property.
The number of items in the list exceeds the maximum set for large lists.
Compare the value that is returned by the list's ItemCount property
with the value that is returned by the web application's
MaxItemsPerThrottledOperation property.
Are any of these conditions true in your case?
As a workaround, I would suggest using a SharePoint Designer workflow or a JSOM script to find and delete the related items in the Calendar list, before finally deleting the item in the Custom list.
For this to work, you would also need to hijack the "Delete" button in the Custom list form, or create a custom Delete button that triggers the workflow.
Alternately, you could create an SPD 2010 workflow and use the WF start form as a "staging area" in which to run the Script.
The script would have three parts: first, get the lookup value you want to search for from the current item. Second, search for items in the Calendar that have that value in the Lookup column. Finally, do a POST call on each item to delete it, making sure to include X-RequestDigest
in the headers:
function deleteItem(listTitle, itemId) {
return jQuery.ajax({
url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle('" + listTitle + "')/getItemById(" + itemId + "),
method: 'POST',
contentType: 'application/json;odata=verbose',
headers: {
'X-RequestDigest': jQuery('#__REQUESTDIGEST').val(),
'X-HTTP-Method': 'DELETE',
'Accept': 'application/json;odata=verbose'
}
});
}