public override void AppendTo(StringBuilder sb, ISqlDialect dialect) { if (!string.IsNullOrEmpty(ConstraintName)) { sb.Append("CONSTRAINT ").Append(ConstraintName).Append(" "); } sb.Append("FOREIGN KEY ( "); if (Columns != null) { bool first = true; foreach (var col in Columns) { if (!first) { sb.Append(", "); } else { first = false; } sb.Append(col.Name); } } else if (ColumnNames != null) { bool first = true; foreach (var col in ColumnNames) { if (!first) { sb.Append(", "); } else { first = false; } sb.Append(col); } } else { throw new InvalidOperationException("either Columns or ColumnNames must be set"); } sb.Append(")"); if (ForeignKeyClause != null) { sb.Append(ForeignKeyClause + " "); } else { sb.Append("REFERENCES " + References + " "); if (ReferenceColumnNames != null && ReferenceColumnNames.Count() > 0) { sb.Append("( "); var first = true; foreach (var col in ReferenceColumnNames) { if (!first) { sb.Append(", "); } else { first = false; } sb.Append(col); } sb.Append(") "); } } var onUpdate = dialect.ConvertToString(OnUpdate); if (onUpdate != null) { sb.Append("ON UPDATE " + onUpdate); } var onDelete = dialect.ConvertToString(OnDelete); if (onDelete != null) { sb.Append("ON DELETE " + onUpdate); } var deferable = dialect.ConvertToString(Deferrable); if (deferable != null) { sb.Append(deferable); } }