Exemplo n.º 1
0
        public override IList <DataRuleProblem> Analyze(DataRuleSetting ruleSetting, DataRuleExecutionContext context)
        {
            var foreignKeyConstraint = context.ModelElement as ISqlForeignKeyConstraint;

            if (foreignKeyConstraint == null)
            {
                return(null);
            }

            ISqlSpecifiesTable definingTable = foreignKeyConstraint.DefiningTable;
            ISqlTable          foreignTable  = foreignKeyConstraint.ForeignTable;

            IList <DataRuleProblem> problems = new List <DataRuleProblem> ();

            string       prefix = definingTable.Name.Parts[1] + "_" + foreignTable.Name.Parts[1];
            const string suffix = "_FK";

            string foreignKeyPattern = @"^" + prefix + @"[a-zA-Z0-9_]*" + suffix;

            if (!Regex.IsMatch(foreignKeyConstraint.Name.Parts[1], foreignKeyPattern))
            {
                string ruleProblemDescription = string.Format(CultureInfo.CurrentCulture,
                                                              "Defining Table [{0}].[{1}]: ForeignKey is named improperly. Expected to start with {2} and end with {3}. Found {4}",
                                                              definingTable.Name.Parts[0],
                                                              definingTable.Name.Parts[1],
                                                              prefix,
                                                              suffix,
                                                              foreignKeyConstraint.Name.Parts[1]);

                var problem = new DataRuleProblem(this, ruleProblemDescription, foreignKeyConstraint)
                {
                    FileName    = foreignKeyConstraint.PrimarySource.SourceName,
                    StartLine   = foreignKeyConstraint.PrimarySource.StartLine,
                    StartColumn = foreignKeyConstraint.PrimarySource.StartColumn
                };

                problems.Add(problem);
            }

            return(problems);
        }
Exemplo n.º 2
0
        public override IList <DataRuleProblem> Analyze(DataRuleSetting ruleSetting, DataRuleExecutionContext context)
        {
            var foreignKeyConstraint = context.ModelElement as ISqlForeignKeyConstraint;

            if (foreignKeyConstraint == null)
            {
                return(null);
            }

            ISqlSpecifiesTable definingTable    = foreignKeyConstraint.DefiningTable;
            ISqlTable          referentialTable = foreignKeyConstraint.ForeignTable;

            string foreignKeyColumnName = foreignKeyConstraint.Columns.First().Name.Parts[2];

            IList <DataRuleProblem> problems = new List <DataRuleProblem>();

            if (referentialTable.HasFoeignKeyAlsoDefinedOnPrimaryKeyColumns())
            {
                bool result = foreignKeyColumnName == referentialTable.Name.Parts[1] + "Key";

                if (!result)
                {
                    string ruleProblemDescription = string.Format(CultureInfo.CurrentCulture,
                                                                  "Defining Table [{0}].[{1}]: Foreign key [{2}] column is not named after the table name of the referential table [{3}].[{4}].  Expected {5}. Found {6}",
                                                                  definingTable.Name.Parts[0],
                                                                  definingTable.Name.Parts[1],
                                                                  foreignKeyConstraint.Name.Parts[1],
                                                                  referentialTable.Name.Parts[0],
                                                                  referentialTable.Name.Parts[1],
                                                                  referentialTable.Name.Parts[1] + "Key",
                                                                  foreignKeyColumnName);

                    var problem = CreateDateRuleProblem(foreignKeyConstraint, ruleProblemDescription);
                    problems.Add(problem);
                }
            }
            else
            {
                ISqlPrimaryKeyConstraint referentialTablePrimaryKey =
                    referentialTable.Constraints.OfType <ISqlPrimaryKeyConstraint>().SingleOrDefault();

                string referentialTablePrimaryKeyColumnName =
                    referentialTablePrimaryKey.ColumnSpecifications[0].Column.Name.Parts[2];

                bool columnsNameMatch = foreignKeyColumnName == referentialTablePrimaryKeyColumnName;

                bool result = columnsNameMatch || foreignKeyColumnName.EndsWith(referentialTablePrimaryKeyColumnName);

                if (!result)
                {
                    string ruleProblemDescription = string.Format(CultureInfo.CurrentCulture,
                                                                  "Defining Table [{0}].[{1}]: Foreign key [{2}] column is not named after (matches or ends with) the primary key column name of the referential table [{3}].[{4}].  Expected {5}. Found {6}",
                                                                  definingTable.Name.Parts[0],
                                                                  definingTable.Name.Parts[1],
                                                                  foreignKeyConstraint.Name.Parts[1],
                                                                  referentialTable.Name.Parts[0],
                                                                  referentialTable.Name.Parts[1],
                                                                  referentialTablePrimaryKeyColumnName,
                                                                  foreignKeyColumnName);

                    var problem = CreateDateRuleProblem(foreignKeyConstraint, ruleProblemDescription);
                    problems.Add(problem);
                }
            }

            return(problems);
        }