The short answer is to set a default value for all columns that have a nullable value. You can do this just with sql using the Execute.Sql expression. This should be before the Alter.Table expression.
public override void Down()
{
Execute.Sql("update foo set bar = 0 where bar is null");
Alter.Table("foo").AlterColumn("bar").AsInt32().NotNullable();
}
The long answer is that it is a lot of work to always ensure that you can roll back a migration and are you sure you need to do that?
For example, if the up action is to create a table and the down action is to drop it, should you save the data in a temp table so that it doesn't disappear? For most use cases the down action is used when deploying in test environments or when rolling back a failed deploy and it is quite rare that you would roll back a migration after it has been deployed.