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}'"); } }