protected override object DoOperation(Adapters.SchemaObjectOperationContext context) { int replacedCount = 0; //取父级的权限定义 var aclMembers = Adapters.SCAclAdapter.Instance.LoadByContainerID(((SchemaObjectBase)(this._Parent)).ID, DateTime.MinValue); InSqlClauseBuilder inBuilder = new InSqlClauseBuilder("ID"); inBuilder.AppendItem((from acl in aclMembers select acl.MemberID).ToArray()); WhereSqlClauseBuilder where = new WhereSqlClauseBuilder(); where.AppendItem("Status", (int)SchemaObjectStatus.Normal); if (inBuilder.IsEmpty) { where.AppendItem("1", "2"); } var memberObjects = Adapters.SchemaObjectAdapter.Instance.Load(new ConnectiveSqlClauseCollection(inBuilder, where), DateTime.MinValue); if (this._Candidates.Count > 0) { ProcessProgress.Current.MaxStep = this._Candidates.Count; ProcessProgress.Current.CurrentStep = 0; ProcessProgress.Current.Output.WriteLine("正在替换子对象ACL"); foreach (SchemaObjectBase candidate in this._Candidates) { string objName = candidate.Properties.GetValue("Name", string.Empty); try { Debug.Assert(this._Parent != null, "容器对象为null"); var oldItems = SCAclAdapter.Instance.LoadByContainerID(candidate.ID, DateTime.MinValue); var container = new SCAclContainer(candidate); foreach (var item in aclMembers) { if (item.Status == SchemaObjectStatus.Normal) { container.Members.Add(item.ContainerPermission, memberObjects[item.MemberID]); } } if (oldItems != null) { container.Members.MergeChangedItems(oldItems); } SCObjectOperations.Instance.UpdateObjectAcl(container); if (SCDataOperationLockContext.Current.Lock != null && (replacedCount) % 5 == 0) { SCDataOperationLockContext.Current.ExtendLock(); } replacedCount++; ProcessProgress.Current.StatusText = string.Format("已替换\"{0}\"的Acl", objName); ProcessProgress.Current.Increment(); ProcessProgress.Current.Response(); } catch (System.Exception ex) { throw new ApplicationException(string.Format("替换对象{0}({1})的Acl出错: {2}", objName, candidate.ID, ex.Message)); } } } else { ProcessProgress.Current.Output.WriteLine("当前对象没有子对象ACL"); ProcessProgress.Current.CurrentStep = ProcessProgress.Current.MaxStep = 1; } ProcessProgress.Current.StatusText = string.Format("总共替换了{0:#,##0}个对象的Acl", replacedCount); ProcessProgress.Current.Response(); return(this._Parent); }
protected override object DoOperation(Adapters.SchemaObjectOperationContext context) { SchemaObjectAdapter.Instance.Update(this._Object); return(this._Object); }