使用FluentMigrator,使用Column
默认创建.AsString()
会产生nvarchar(255)
。是否有一种简单的方法(在我修改FluentMigrator代码之前)来创建nvarchar(MAX)
类型的列?
答案 0 :(得分:62)
你可以在.AsMaxString()
中创建一个扩展方法来包装.AsString(Int32.MaxValue)。e.g。
internal static class MigratorExtensions
{
public static ICreateTableColumnOptionOrWithColumnSyntax AsMaxString(this ICreateTableColumnAsTypeSyntax createTableColumnAsTypeSyntax)
{
return createTableColumnAsTypeSyntax.AsString(int.MaxValue);
}
}
答案 1 :(得分:26)
好的,我找到了。基本上,使用.AsString(Int32.MaxValue)。可惜没有.AsMaxString()方法,但我想这很容易投入......
答案 2 :(得分:18)
您可以使用AsCustom("nvarchar(max)")
并将其打包到扩展程序
答案 3 :(得分:7)
如果您经常使用相同的设置或列组创建列/表,则应该为迁移创建扩展方法!
例如,我的几乎每一个表都有CreatedAt和UpdatedAt DateTime列,所以我掀起了一个小扩展方法,所以我可以说:
Create.Table("Foos").
WithColumn("a").
WithTimestamps();
我想我正确地创建了Extension方法...我知道它有效,但是FluentMigrator有一个 LOT 接口......这里是:
public static class MigrationExtensions {
public static ICreateTableWithColumnSyntax WithTimestamps(this ICreateTableWithColumnSyntax root) {
return root.
WithColumn("CreatedAt").AsDateTime().NotNullable().
WithColumn("UpdatedAt").AsDateTime().NotNullable();
}
}
同样,我的几乎每一个表都有一个名为'Id'的int主键,所以我想我要添加Table.CreateWithId("Foos")
来为我添加该ID。不确定......我实际上刚刚开始使用FluentMigrator,但你应该尽可能重构!
注意:如果您确实为迁移制定了帮助/扩展方法,那么永远不会 改变这些方法的作用。如果你这样做,有人可能会尝试运行你的迁移,事情可能会爆炸,因为你用来创建Migration#1的辅助方法现在的工作方式与之前不同。
以下是创建列的代码,可以帮助您创建辅助方法:https://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator/Builders/Create/Column/CreateColumnExpressionBuilder.cs
答案 4 :(得分:1)
像这样扩展怎么样:
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)");
}
}