/// <summary> /// Method executed when parent <see cref="Coordinator"/> enters the <c>ValidateTransaction</c> phase. /// </summary> /// <param name="businessObject">Optional parameter.</param> public override void OnValidateTransaction(IBusinessObject businessObject) { var presentGroupsId = from node in ((Configuration)this.businessObject.AlternateVersion).Value.Descendants() where node.Name.LocalName == "group" && node.Attribute("id") != null && node.Attribute("id").Value.Length != 0 select node.Attribute("id").Value; var modifiedGroupsId = from node in this.businessObject.Value.Descendants() where node.Name.LocalName == "group" && node.Attribute("id") != null && node.Attribute("id").Value.Length != 0 select node.Attribute("id").Value; var deletedGroupsId = from grpId in presentGroupsId where modifiedGroupsId.Contains(grpId) == false select grpId; Configuration conf = (Configuration)businessObject; if (conf.Key == "contractors.group") { ContractorMapper mapper = DependencyContainerManager.Container.Get <ContractorMapper>(); //check if any group that contains attached contractors has been deleted foreach (string group in deletedGroupsId) { int count = mapper.GetContractorGroupMembershipsCount(new Guid(group)); if (count > 0) { throw new ClientException(ClientExceptionId.ContractorsGroupDeleteException, null, "count:" + count.ToString(CultureInfo.InvariantCulture)); } } } else if (conf.Key == "items.group") { ItemMapper mapper = DependencyContainerManager.Container.Get <ItemMapper>(); //check if any group that contains attached contractors has been deleted foreach (string group in deletedGroupsId) { int count = mapper.GetItemGroupMembershipsCount(new Guid(group)); if (count > 0) { throw new ClientException(ClientExceptionId.ItemsGroupDeleteException, null, "count:" + count.ToString(CultureInfo.InvariantCulture)); } } } }