private void OnBeforeSaveDataSet(object sender, OnBeforeSaveDataSetEventArgs e)
        {
            if (e.Entity.IsMarkedForDeletion)
            {
                Transaction.Join(e.Parameters, $"Delete-DataSet-IsMarkedForDeletion-{e.Entity.GetType().Name}");

                // It's possible for apps to register more than one DeleteHandler for an entity.
                // In this case, OnBeforeSaveDataSet will come through here once for each handler (i.e. through same code, but different instance, because of the TEntity genericity)
                // We can only delete an entity once... so we need to check to see if the entity has already been resolved in the delete stack before proceeding
                // Also note: Can't use this.DeleteStack because we may not be the instance that did the delete! It's safest to get it from e.Parameters, anyway.
                var deleteStack = e.Parameters.ContainsKey(ParameterKeys.DeleteStack) ? e.Parameters[ParameterKeys.DeleteStack] as DeleteStack : null;
                if (deleteStack == null || !deleteStack.IsResolved(e.Entity))
                {
                    try
                    {
                        dynamic db = ApplicationSettings.Container.Resolve <IEntityDataProvider>().GetDataProviderForEntity(e.Entity) as IDataProvider;
                        if (db != null)
                        {
                            db.Delete(e.Entity, e.FilterExpression, e.Context, e.Parameters, e.SkipSecurity);
                        }

                        // GRD-443
                        // There may be objects in the saveset that are not IsMarkedForDeletion, but which have been cascade deleted
                        // So we need to remove all deleted objects here, since otherwise the Save() will continue and the ORM will complain that we're trying to save things that no longer exist
                        {
                            deleteStack = e.Parameters.ContainsKey(ParameterKeys.DeleteStack) ? e.Parameters[ParameterKeys.DeleteStack] as DeleteStack : null;
                            foreach (var deleted in deleteStack.Resolved)
                            {
                                e.Entity.ObjectsDataSet.RemoveObject(deleted);
                                e.Context.RemoveObject(deleted);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Transaction.Leave(ex);
                        throw;
                    }
                }
            }
        }
        void OnBeforeSaveDataSet(object sender, OnBeforeSaveDataSetEventArgs e)
        {
            // If delete in progress, no action required
            if (e.IsDeleteInProgress)
            {
                return;
            }

            if (e.Entity == null)
            {
                return;
            }

            string entityName = e.Entity.GetType().Name.Replace("DataObject", "");

            switch (entityName)
            {
            default:
                throw new GOServerException($"GOFileUploader, no handler found for entity type '{entityName}'");
            }
        }