示例#1
0
 /// <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);
         }
     }
 }
示例#2
0
        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();
                }
            }
        }