FluentMigratorを使用すると、 Column
usingのデフォルトの作成はになり.AsString()
ますnvarchar(255)
。(FluentMigratorコードを変更する前に)タイプの列を作成する簡単な方法はありますnvarchar(MAX)
か?
5 に答える
.AsString(Int32.MaxValue)を.AsMaxString()内にラップする拡張メソッドを作成できます。
例えば
internal static class MigratorExtensions
{
public static ICreateTableColumnOptionOrWithColumnSyntax AsMaxString(this ICreateTableColumnAsTypeSyntax createTableColumnAsTypeSyntax)
{
return createTableColumnAsTypeSyntax.AsString(int.MaxValue);
}
}
OK、見つけました。基本的に、.AsString(Int32.MaxValue)を使用します。残念ながら.AsMaxString()メソッドはありませんが、簡単に挿入できると思います...
AsCustom("nvarchar(max)")
使用して拡張機能にパックできます
同じ設定または列のグループで列/テーブルを頻繁に作成する場合は、移行用の拡張メソッドを作成する必要があります。
たとえば、ほぼすべてのテーブルにCreatedAt列とUpdatedAt DateTime列があるため、次のように拡張メソッドを作成しました。
Create.Table("Foos").
WithColumn("a").
WithTimestamps();
私はExtensionメソッドを適切に作成したと思います...それが機能することは知っていますが、FluentMigratorにはたくさんのインターフェースがあります...ここにあります:
public static class MigrationExtensions {
public static ICreateTableWithColumnSyntax WithTimestamps(this ICreateTableWithColumnSyntax root) {
return root.
WithColumn("CreatedAt").AsDateTime().NotNullable().
WithColumn("UpdatedAt").AsDateTime().NotNullable();
}
}
Table.CreateWithId("Foos")
同様に、私のテーブルのほぼすべてに「Id」と呼ばれるint主キーがあるので、常にそのIdを追加するために追加するつもりだと思います。わからない...私は実際に今日FluentMigratorを使い始めたばかりですが、可能な場合は常にリファクタリングする必要があります。
注:移行のためにヘルパー/拡張メソッドを作成する場合は、それらのメソッドの機能を変更しない で ください。そうした場合、誰かがあなたの移行を実行しようとする可能性があり、移行#1の作成に使用したヘルパーメソッドの動作が以前とは異なるため、事態が爆発する可能性があります。
ヘルパーメソッドの作成に役立つ場合に備えて、列を作成するためのコードは次のとおりです。https ://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator/Builders/Create/Column/CreateColumnExpressionBuilder.cs
このように拡張するのはどうですか?
public static class StringMaxMigratorExtensions
{
public static ICreateTableColumnOptionOrWithColumnSyntax AsStringMax(this ICreateTableColumnAsTypeSyntax createTableColumnAsTypeSyntax)
{
return createTableColumnAsTypeSyntax.AsCustom("nvarchar(max)");
}
public static IAlterColumnOptionSyntax AsStringMax(this IAlterColumnAsTypeSyntax alterColumnAsTypeSyntax)
{
return alterColumnAsTypeSyntax.AsCustom("nvarchar(max)");
}
}