public void Commit() { var client = Utility.GetClient(); var facet = new SetSearchFacet(); facet.ItemTypes.Add(DdiItemType.Group); facet.ItemTypes.Add(DdiItemType.DdiInstance); facet.ReverseTraversal = true; var toCommit = new List <IVersionable>(); toCommit.AddRange(toBeAdded); toCommit.AddRange(workingSet.OfType <VariableScheme>()); toCommit.AddRange(workingSet.OfType <VariableGroup>()); toCommit.AddRange(workingSet.OfType <ControlConstructScheme>()); toCommit.AddRange(workingSet.OfType <ControlConstructGroup>()); foreach (var scope in scopes) { toCommit.AddRange(scope.Value.toBeAdded); } var versioner = new Versioner(); var acceptedTypes = new List <Guid>() { DdiItemType.ResourcePackage, DdiItemType.DataCollection, DdiItemType.InstrumentScheme, DdiItemType.Instrument, DdiItemType.VariableScheme, DdiItemType.ControlConstructScheme }; var joints = toCommit.Where(x => acceptedTypes.Contains(x.ItemType)).ToList(); var tops = new Dictionary <IdentifierTriple, IVersionable>(); foreach (var joint in joints) { var set = client.SearchTypedSet(joint.CompositeId, facet); foreach (var parent in set) { var top = client.GetItem( parent.CompositeId, ChildReferenceProcessing.PopulateLatest ) as IVersionable; if (top != null) { tops[top.CompositeId] = top; } } } foreach (var top in tops) { toCommit.Add(top.Value); var one_down = top.Value.GetChildren().ToList(); for (var i = 0; i < one_down.Count; i++) { toCommit.Add(one_down[i]); IVersionable su_joint; if ((su_joint = toCommit.FirstOrDefault(x => one_down[i].CompositeId.Identifier == x.CompositeId.Identifier)) != default(IVersionable)) { top.Value.ReplaceChild(one_down[i].CompositeId, su_joint); } else { foreach (var child in one_down[i].GetChildren().ToList()) { var bottom_joint = toCommit.FirstOrDefault(x => x.CompositeId == child.CompositeId); if (bottom_joint != default(IVersionable)) { one_down[i].ReplaceChild(child.CompositeId, bottom_joint); } } } } versioner.IncrementDityItemAndParents(top.Value); } client.RegisterItems(toCommit, new CommitOptions()); }