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