コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
 public bool IsWebPlatform()
 {
     //TODO: multi level hierarchy
     return(ClientPlatform.Web == Platform || (ParentSchema != null && ParentSchema.IsWebPlatform()));
 }