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(); }
protected abstract void doLoad(UnitOfWork uow, DomainObject obj);
public ObjectLoadedEventArgs(DomainObject objLoaded) { ObjectLoaded = objLoaded; }
public DeletingObjectEventArgs(DomainObject obj) { DeletingObject = obj; }
public DeleteObjectConflictEventArgs(DomainObject objDeleted, ArrayList aReferences, ArrayList aMandatoryReferences) { ObjectDeleted = objDeleted; AllReferences = aReferences; MandatoryReferences = aMandatoryReferences; }
public GetObjectConflictEventArgs(DomainObject objFromServer, DomainObject objLocal) { ObjectFromServer = objFromServer; ObjectLocal = objLocal; }
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); }