コード例 #1
0
ファイル: DomainObjectProps.cs プロジェクト: SanSay157/IT8
        protected override void synchronizeRemove(DomainObject objValue)
        {
            Debug.Assert(objValue != null);
            // синхронизируем обратное свойство
            DomainPropObjectScalar propRev = (DomainPropObjectScalar)getReverseProp(objValue);

            if (propRev != null)
            {
                propRev.internal_SetPendingAction(DomainPropPendingActionMode.Clear, null);
            }
        }
コード例 #2
0
ファイル: DomainObjectProps.cs プロジェクト: SanSay157/IT8
        protected override void synchronizeAdd(DomainObject obj)
        {
            // синхронизируем обратное свойство
            DomainPropObjectScalar propRev = (DomainPropObjectScalar)getReverseProp(obj);

            if (propRev != null)
            {
                // переставим обратную объектную ссылку на текущий объект
                propRev.internal_SetPendingAction(DomainPropPendingActionMode.Set, m_objParent);
            }
        }
コード例 #3
0
ファイル: UnitOfWork.cs プロジェクト: SanSay157/IT8
        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();
        }
コード例 #4
0
ファイル: UnitOfWork.cs プロジェクト: SanSay157/IT8
        protected virtual DomainPropBase createPropInstace(DomainObject obj, XPropInfoBase xpropInfo)
        {
            DomainPropBase prop;

            switch (xpropInfo.VarType)
            {
            case XPropType.vt_object:
                if (xpropInfo is XPropInfoObjectScalar)
                {
                    prop = new DomainPropObjectScalar(obj, (XPropInfoObject)xpropInfo);
                }
                else if (xpropInfo is XPropInfoObjectArray)
                {
                    prop = new DomainPropCollection(obj, (XPropInfoObjectArray)xpropInfo);
                }
                else if (xpropInfo is XPropInfoObjectLink)
                {
                    prop = new DomainPropLink(obj, (XPropInfoObjectLink)xpropInfo);
                }
                else
                {
                    throw new ApplicationException();
                }
                break;

            case XPropType.vt_text:
                prop = new DomainPropText(obj, xpropInfo);
                break;

            case XPropType.vt_bin:
                prop = new DomainPropBinary(obj, xpropInfo);
                break;

            case XPropType.vt_boolean:
                prop = new DomainPropBoolean(obj, (XPropInfoBoolean)xpropInfo);
                break;

            case XPropType.vt_string:
                prop = new DomainPropString(obj, (XPropInfoString)xpropInfo);
                break;

            case XPropType.vt_uuid:
                prop = new DomainPropUUID(obj, (XPropInfoSimple)xpropInfo);
                break;

            case XPropType.vt_smallBin:
                prop = new DomainPropSmallBin(obj, (XPropInfoSmallBin)xpropInfo);
                break;

            case XPropType.vt_r4:
                prop = new DomainPropNumericSingle(obj, (XPropInfoNumeric)xpropInfo);
                break;

            case XPropType.vt_r8:
                prop = new DomainPropNumericDouble(obj, (XPropInfoNumeric)xpropInfo);
                break;

            case XPropType.vt_fixed:
                prop = new DomainPropNumericDecimal(obj, (XPropInfoNumeric)xpropInfo);
                break;

            default:
                if (xpropInfo is XPropInfoNumeric)
                {
                    prop = new DomainPropNumericInt(obj, (XPropInfoNumeric)xpropInfo);
                }
                else if (xpropInfo is XPropInfoDatetime)
                {
                    prop = new DomainPropDateTime(obj, (XPropInfoDatetime)xpropInfo);
                }
                else
                {
                    throw new ApplicationException();
                }
                break;
            }
            return(prop);
        }