private void DeleteImpl(ServerObject obj) { if (obj.Processed) { return; } Trace.WriteLineIf(DebugOutput.Enabled, "Deleting ServerObject of type " + obj.ServerObjectType); switch (obj.State) { case ObjectState.Added: Trace.WriteLineIf(DebugOutput.Enabled, "Setting state to ObjectState.Detached"); obj.State = ObjectState.Detached; break; case ObjectState.Modified: case ObjectState.Unchanged: Trace.WriteLineIf(DebugOutput.Enabled, "Setting state to ObjectState.Deleted"); obj.State = ObjectState.Deleted; break; case ObjectState.Deleted: case ObjectState.Detached: break; default: throw new ObjectServerException("Invalid ObjectState found."); } ; obj.Processed = true; TypeSchema parentTypeSchema = SchemaCache.Current.GetSchema(obj.ServerObjectType); Trace.WriteLineIf(DebugOutput.Enabled, "Enumerating Childrean"); foreach (ChildrenSchema childSchema in parentTypeSchema.ChildrenSchemas) { Trace.WriteLineIf(DebugOutput.Enabled, "Checking Children " + childSchema.Property.Name); ServerObjectCollection children = obj.Children[childSchema.Property.Name] as ServerObjectCollection; TypeSchema childTypeSchema = SchemaCache.Current.GetSchema(childSchema.ChildType); ParentSchema parentSchema = childTypeSchema.FindParentSchema(childSchema.PropertyName); int nonDeleted = 0; foreach (ServerObject child in children) { if (child.State != ObjectState.Deleted && child.State != ObjectState.Detached) { nonDeleted++; } } Trace.WriteLineIf(DebugOutput.Enabled, "Counted " + nonDeleted + " non-deleted children"); if (nonDeleted > 0) { if (parentSchema.DeleteAction == DeleteAction.Throw) { throw new ObjectServerException(String.Format(CultureInfo.CurrentCulture, "Could not delete, {0}.{1} has DeleteAction.Throw", childTypeSchema.Type.FullName, parentSchema.Property.Name)); } if (parentSchema.DeleteAction == DeleteAction.Null) { Trace.WriteLineIf(DebugOutput.Enabled, "Changing key to DBNull.Value and updating state"); foreach (ServerObject child in children) { child.Data.SetValue(childSchema.PropertyName, DBNull.Value); switch (child.State) { case ObjectState.Added: case ObjectState.Modified: case ObjectState.Detached: case ObjectState.Deleted: break; case ObjectState.Unchanged: child.State = ObjectState.Modified; break; default: throw new ObjectServerException("Invalid ObjectState found."); } ; } continue; } } Trace.WriteLineIf(DebugOutput.Enabled, "Processing children"); foreach (ServerObject child in children) { DeleteImpl(child); } } }
public bool IsWebPlatform() { //TODO: multi level hierarchy return(ClientPlatform.Web == Platform || (ParentSchema != null && ParentSchema.IsWebPlatform())); }