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);
        }