public static IAlterTableColumnOptionOrAddColumnOrAlterColumnSyntax AddForeignKey(this IAlterTableAddColumnOrAlterColumnSyntax table, string primaryTableName, FluentMigrator.Migration migration) { var expression = ((AlterTableExpressionBuilder)table).Expression; var fromTableName = expression.TableName; var fkName = migration.GenerateFkName(primaryTableName, fromTableName); return(table .AddColumn(primaryTableName + ColumnName.Id).AsGuid() .ForeignKey(fkName, primaryTableName, ColumnName.Id)); }
/// <summary> /// Create a foreign columnName to the table <paramref name="primaryTableName"/><br/> /// ------------------------------------------------------------------ <br/> /// If <paramref name="columnName"/> is specified, the new column-name will follow that value<br/> /// If <paramref name="columnName"/> is unspecified, the new column-name will be computed<br/> /// <br/> /// If <paramref name="primaryColumnName"/> is specified, the primary-table-column will follow that value<br/> /// If <paramref name="primaryColumnName"/> is unspecified, the primary-table-column will be computed<br/> /// <br/> /// i.e:<br/> /// <paramref name="columnName"/> is unspecified and <paramref name="primaryTableName"/> is "Parent" => column-name will be computed to "ParentId"<br/> /// <br/> /// <paramref name="primaryColumnName"/> is unspecified => the primary-table-column will be "Id"<br/> /// </summary> /// <param name="syntax"></param> /// <param name="primaryTableName"></param> /// <param name="migration"></param> /// <param name="schemaPrefix"></param> /// <param name="columnName"></param> /// <param name="primaryColumnName"></param> /// <param name="errors"></param> /// <returns></returns> public static ICreateTableColumnAsTypeSyntax WithForeignKeyColumn( this ICreateTableWithColumnSyntax syntax, string primaryTableName, FluentMigrator.Migration migration, string schemaPrefix = null, string columnName = null, string primaryColumnName = null, params int[] errors) { var expression = ((CreateTableExpressionBuilder)syntax).Expression; var fromTable = expression.TableName.GetPrefixedName(schemaPrefix); var fromSchemaName = expression.SchemaName; var toSchemaName = fromSchemaName; var split = primaryTableName.Split('.'); if (split.Length == 2) { primaryTableName = split[1]; toSchemaName = split[0]; } var fkName = migration?.GenerateFkName(primaryTableName, fromTable.TrimPrefixName(schemaPrefix), schemaPrefix); columnName = columnName ?? primaryTableName + ColumnName.Id; primaryColumnName = primaryColumnName ?? ColumnName.Id; var syntaxWithColumn = syntax.WithColumn(columnName); var fkSyntax = migration?.Create .ForeignKey(fkName) .FromTable(fromTable).InSchema(fromSchemaName) .ForeignColumn(columnName) .ToTable(primaryTableName).InSchema(toSchemaName) .PrimaryColumn(primaryColumnName) .OnDelete(Rule.SetNull); if (fkSyntax is CreateForeignKeyExpressionBuilder builder) { var id = $"{nameof(CreateForeignKeyExpression)}_{builder.Expression.ForeignKey.PrimaryTable}"; AddOrUpdateErrorFilter(id, errors); var id2 = $"{nameof(CreateForeignKeyExpression)}_{builder.Expression.ForeignKey.ForeignTable}"; AddOrUpdateErrorFilter(id2, errors); } return(syntaxWithColumn); }
public static ICreateTableColumnAsTypeSyntax WithForeignKeyColumn( this ICreateTableWithColumnSyntax table, string primaryTableName, FluentMigrator.Migration migration) { var expression = ((CreateTableExpressionBuilder)table).Expression; var fromTable = expression.TableName; var schemaName = expression.SchemaName; var fkName = migration?.GenerateFkName(primaryTableName, fromTable); var foreignColumn = primaryTableName + ColumnName.Id; var syntax = table.WithColumn(foreignColumn); migration?.Create .ForeignKey(fkName) .FromTable(fromTable) .InSchema(schemaName) .ForeignColumn(foreignColumn) .ToTable(primaryTableName) .InSchema(schemaName) .PrimaryColumn(ColumnName.Id) .OnDelete(Rule.SetNull); return(syntax); }