public override string Generate(Expressions.CreateForeignKeyExpression expression) { if (expression.ForeignKey.PrimaryColumns.Count != expression.ForeignKey.ForeignColumns.Count) { throw new ArgumentException("Number of primary columns and secondary columns must be equal"); } var keyName = string.IsNullOrEmpty(expression.ForeignKey.Name) ? Column.GenerateForeignKeyName(expression.ForeignKey) : expression.ForeignKey.Name; var keyWithSchema = Quoter.QuoteConstraintName(keyName, expression.ForeignKey.ForeignTableSchema); var primaryColumns = expression.ForeignKey.PrimaryColumns.Aggregate(new StringBuilder(), (acc, col) => { var separator = acc.Length == 0 ? string.Empty : ", "; return(acc.AppendFormat("{0}{1}", separator, Quoter.QuoteColumnName(col))); }); var foreignColumns = expression.ForeignKey.ForeignColumns.Aggregate(new StringBuilder(), (acc, col) => { var separator = acc.Length == 0 ? string.Empty : ", "; return(acc.AppendFormat("{0}{1}", separator, Quoter.QuoteColumnName(col))); }); return(string.Format( "ALTER TABLE {0} ADD CONSTRAINT {1} FOREIGN KEY ({2}) REFERENCES {3} ({4}){5}", Quoter.QuoteTableName(expression.ForeignKey.ForeignTable, expression.ForeignKey.ForeignTableSchema), keyWithSchema, foreignColumns, Quoter.QuoteTableName(expression.ForeignKey.PrimaryTable, expression.ForeignKey.PrimaryTableSchema), primaryColumns, Column.FormatCascade("DELETE", expression.ForeignKey.OnDelete))); }
public void Process(Expressions.CreateForeignKeyExpression expression) { Process(Generator.Generate(expression)); }