/// <summary> /// AddRule: typeof(UniquenessConstraintIncludesColumn) /// Verify any related <see cref="ReferenceConstraint"/> when a new /// column is added to a uniqueness constraint. The reference constraint /// needs to be deleted if the calling code has not made a matching modification /// by the end of the transaction. /// </summary> private static void UniquenessConstraintColumnAdded(ElementAddedEventArgs e) { foreach (ReferenceConstraint referenceConstraint in ReferenceConstraintTargetsUniquenessConstraint.GetReferenceConstraintCollection(((UniquenessConstraintIncludesColumn)e.ModelElement).UniquenessConstraint)) { ReferenceConstraintTargetsTable tableLink = ReferenceConstraintTargetsTable.GetLinkToTargetTable(referenceConstraint); if (tableLink != null) { FrameworkDomainModel.DelayValidateElement(tableLink, DelayValidateTargetUniquenessConstraint); } } }
private static void ValidateTargetUniquenessConstraint(ReferenceConstraintTargetsTable tableReference, INotifyElementAdded notifyAdded) { if (tableReference.IsDeleted) { return; } Table targetTable = tableReference.TargetTable; ReferenceConstraint referenceConstraint = tableReference.ReferenceConstraint; LinkedElementCollection <ColumnReference> columnRefs = referenceConstraint.ColumnReferenceCollection; int columnRefCount = columnRefs.Count; ReferenceConstraintTargetsUniquenessConstraint targetUniquenessLink = ReferenceConstraintTargetsUniquenessConstraint.GetLinkToTargetUniquenessConstraint(referenceConstraint); if (targetUniquenessLink != null) { // Verify the target uniqueness UniquenessConstraint targetUniqueness = targetUniquenessLink.TargetUniquenessConstraint; bool existingIsValid = targetUniqueness.Table == targetTable; if (existingIsValid) { LinkedElementCollection <Column> uniquenessColumns = targetUniqueness.ColumnCollection; existingIsValid = uniquenessColumns.Count == columnRefCount; if (existingIsValid) { for (int i = 0; i < columnRefCount; ++i) { if (uniquenessColumns[i] != columnRefs[i].TargetColumn) { existingIsValid = false; break; } } } } if (!existingIsValid) { // Delete the link without deleting the reference constraint we're processing targetUniquenessLink.Delete(ReferenceConstraintTargetsUniquenessConstraint.ReferenceConstraintDomainRoleId); targetUniquenessLink = null; } } if (targetUniquenessLink == null) { foreach (UniquenessConstraint testUniqueness in targetTable.UniquenessConstraintCollection) { LinkedElementCollection <Column> uniquenessColumns = testUniqueness.ColumnCollection; if (uniquenessColumns.Count == columnRefCount) { int i = 0; for (; i < columnRefCount; ++i) { if (uniquenessColumns[i] != columnRefs[i].TargetColumn) { break; } } if (i == columnRefCount) { // We have a match targetUniquenessLink = new ReferenceConstraintTargetsUniquenessConstraint(referenceConstraint, testUniqueness); if (notifyAdded != null) { notifyAdded.ElementAdded(targetUniquenessLink, false); } break; } } } if (targetUniquenessLink == null) { referenceConstraint.Delete(); } } }