鉴于以下迁移:
[Migration(1)] public class Mig001 : Migration { public override void Up() { Alter.Table("foo").AlterColumn("bar").AsInt32().Nullable(); } public override void Down() { Alter.Table("foo").AlterColumn("bar").AsInt32().NotNullable(); } }
迁移器更改列并使其为空,并且在回滚时反向执行,并使其不再为空.
让我们说数据已经被自动迁移到foo中了现在有条列为空的行.
如果它被回滚,那么操作将失败,Fluentmigrator有什么办法来处理这种情况吗?或者最好的做法是什么
解决方法
简单的答案是为具有可空值的所有列设置默认值.您可以使用Execute.sql表达式使用sql.这应该在Alter.Table表达式之前.
public override void Down() { Execute.sql("update foo set bar = 0 where bar is null"); Alter.Table("foo").AlterColumn("bar").AsInt32().NotNullable(); }
长期的答案是,始终确保您可以回滚迁移是很多工作,您确定需要这样做吗?
例如,如果up操作是创建一个表,并且down操作是将其删除,那么应该将数据保存在临时表中,使其不会消失?对于大多数用例,在部署在测试环境中或在回滚失败的部署时使用down操作,并且在部署之后您将很容易回滚迁移.