public void RestoreObject(AuditDataItemPersistent audit) { object currentobj = audit.AuditedObject.Target; if (!RestoredObjects.Contains(currentobj)) { RestoredObjects.Add(currentobj); } else { return; } ITypeInfo currenttypeinfo = XafTypesInfo.Instance.FindTypeInfo(currentobj.GetType()); foreach (AuditDataItemPersistent item in ObjectSpace.CreateCollection(typeof(AuditDataItemPersistent), CriteriaOperator.Parse("(AuditedObject = ? OR OldObject.TargetKey = ?) AND ModifiedOn >= ? AND (OperationType = 'ObjectDeleted' OR OperationType = 'RemovedFromCollection')", audit.AuditedObject, XPWeakReference.KeyToString(currenttypeinfo.KeyMember.GetValue(currentobj)), audit.ModifiedOn), new List <SortProperty>() { new SortProperty("ModifiedOn", DevExpress.Xpo.DB.SortingDirection.Ascending) })) { if (item.OperationType == "ObjectDeleted") { UndeleteObjectCore(currentobj, currenttypeinfo); } else if (item.OperationType == "RemovedFromCollection") { object oldobj = item.OldObject.Target; UndeleteObject(oldobj); object associatedobject = item.AuditedObject.Target; UndeleteObject(associatedobject); ITypeInfo associatedobjectinfo = XafTypesInfo.Instance.FindTypeInfo(associatedobject.GetType()); IList collection = associatedobjectinfo.FindMember(item.PropertyName).GetValue(associatedobject) as IList; collection.Add(oldobj); RestoreAggregateObjects(oldobj); RestoreAggregateObjects(associatedobject); } } RestoreAggregateObjects(currentobj); }
private void UndeleteObject(object obj) { if (obj == null || RestoredObjects.Contains(obj)) { return; } ITypeInfo objinfo = XafTypesInfo.Instance.FindTypeInfo(obj.GetType()); UndeleteObjectCore(obj, objinfo); XPCollection <AuditDataItemPersistent> originalcollection = AuditedObjectWeakReference.GetAuditTrail((ObjectSpace as XPObjectSpace).Session, obj); if (originalcollection != null) { XPCollection <AuditDataItemPersistent> oldobjaudit = new XPCollection <AuditDataItemPersistent>(originalcollection, new BinaryOperator("OperationType", "ObjectDeleted")); if (oldobjaudit.Count > 0) { RestoreObject(oldobjaudit.OrderByDescending(x => x.ModifiedOn).First()); } } }
public void Dispose() { aggregateChecked.Clear(); RestoredObjects.Clear(); ObjectSpace = null; }