The smartest way is probably to not alter types. If you need to do this, I'd suggest you to do the following steps:
-
Add a new column with your new type
-
Use Sql() to take over the data from the original column using an update statement
-
Remove the old column
-
Rename the new column
This can all be done in the same migration, the correct SQL script will be created. You can skip step 2 if you want your data to be discarded. If you want to take it over, add the appropriate statement (can also contain a switch statement).
Unfortunately Code First Migrations do not provide easier ways to accomplish this.
Here is the example code:
AddColumn("dbo.People", "LocationTmp", c => c.Int(nullable: false)); Sql(@" UPDATE dbp.People SET LocationTmp = CASE Location WHEN 'London' THEN 1 WHEN 'Edinburgh' THEN 2 WHEN 'Cardiff' THEN 3 ELSE 0 END "); DropColumn("dbo.People", "Location"); RenameColumn("dbo.People", "LocationTmp", "Location");