Exemplo n.º 1
0
        protected override void synchronizeAdd(DomainObject obj)
        {
            // синхронизируем обратное свойство
            DomainPropCollectionBase propRev = (DomainPropCollectionBase)getReverseProp(obj);

            if (propRev != null)
            {
                // переставим обратную объектную ссылку на текущий объект
                propRev.internal_AddPendingAction(DomainPropPendingActionMode.Add, m_objParent);
            }
        }
Exemplo n.º 2
0
        internal void deleteObject(DomainObject obj)
        {
            OnDeletingObject(new DeletingObjectEventArgs(obj));
            // Сформируем список ссылок и список обязательных ссылок на текущий объект
            ArrayList aReferences          = new ArrayList();
            ArrayList aMandatoryReferences = new ArrayList();

            // по всем свойствам Скаляр, Массив, Коллекция, ссылающиймся на тип текущего объекта
            foreach (XPropInfoObject propInfo in obj.TypeInfo.ReferencesOnMe)
            {
                // по всем объектам реестра, обладающим текущим свойством
                foreach (DomainObject objRef in m_objects.GetSameTypeObjects(propInfo.ParentType.Name).Values)
                {
                    // ссылки со стороны заглушек и инвалиндых объектов нам не интересны
                    if (!objRef.IsLoaded && !objRef.IsNew)
                    {
                        continue;
                    }
                    DomainPropBase prop = (DomainPropBase)objRef.Props[propInfo.Name];
                    if (prop == null)
                    {
                        continue;
                    }

                    if (prop is DomainPropObjectScalar)
                    {
                        DomainPropObjectScalar propScalar = (DomainPropObjectScalar)prop;
                        if (propScalar.HasReferedOn(obj.ObjectID))
                        {
                            aReferences.Add(propScalar);
                            if (propScalar.PropInfo.NotNull)
                            {
                                aMandatoryReferences.Add(propScalar);
                            }
                        }
                    }
                    else if (prop is DomainPropCollectionBase)
                    {
                        DomainPropCollectionBase propCol = (DomainPropCollectionBase)prop;
                        if (propCol.FindObjectValue(obj.ObjectID) != null)
                        {
                            aReferences.Add(prop);
                            // если массив или коллекция без обратного свойства, значит свойство обязательное
                            if (!(propCol.PropInfo.Capacity == XPropCapacity.Collection && propCol.PropInfo.ReverseProp == null))
                            {
                                aMandatoryReferences.Add(prop);
                            }
                        }
                    }
                }
            }
            if (aReferences.Count > 0)
            {
                if (OnDeleteObjectConflict(new DeleteObjectConflictEventArgs(obj, aReferences, aMandatoryReferences)))
                {
                    // TODO: а что делать дальше???
                    return;
                }
                else
                {
                    throw new InvalidOperationException("Объект " + obj.ObjectType + " [" + obj.ObjectID.ToString() + "] не может быть удален, т.к. на него имеются обязательные ссылки");
                }
            }

            // раз объект можно удалять, вычистим ссылки на него из линков, членств в коллекции и массиве
            foreach (DomainPropBase prop in obj.Props.Values)
            {
                if (prop is DomainPropObjectBase)
                {
                    XPropInfoBase revPropInfo = ((DomainPropObjectBase)prop).PropInfo.ReverseProp;
                    // синхронизируем "слабые" обратные свойства, т.е. удалим ссылки на текущий объект
                    if (revPropInfo != null)
                    {
                        if (prop is DomainPropObjectScalar)
                        {
                            // удалим текущий объект из обратного линка
                            DomainPropObjectScalar propScalar = (DomainPropObjectScalar)prop;
                            if (!propScalar.IsNull)
                            {
                                ((DomainPropLink)propScalar.Value.Props[revPropInfo.Name]).internal_AddPendingAction(DomainPropPendingActionMode.Remove, obj);
                            }
                        }
                        else if (prop is DomainPropArray || prop is DomainPropCollection)
                        {
                            // удалим текущий объект из обратного членства в массиве или членства в коллекции
                            DomainPropCollectionBase propArray = (DomainPropCollectionBase)prop;
                            foreach (DomainObject objValue in propArray.Internal_Values)
                            {
                                ((DomainPropCollectionBase)objValue.Props[revPropInfo.Name]).internal_AddPendingAction(DomainPropPendingActionMode.Remove, obj);
                            }
                        }
                    }
                }
            }
            if (obj.IsNew)
            {
                m_objects.Remove(obj);
            }
            obj.setDeleted();
        }