问题
Let's say we have the following simple model:
public class Car
{
public int Year { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public CarType Type { get; set; }
}
public enum CarType
{
Car, Truck
}
Entity Framework, when adding a new Car
object to the database, will store the CarType
enum value as an integer.
If we change the CarType
enum in a way where the integer values change (change the order or add/remove values), does Entity Framework know how to properly handle the data migration using Migrations?
For example, let's say we added another value to CarType
:
public enum CarType
{
Car, Truck, Van
}
This would have no real effect on the existing data in the database. 0
is still Car
, and 1
is still Truck
. But if we changed the order of CarType
, like this:
public enum CarType
{
Car, Van, Truck
}
Database records with 1
as the CarType
to designate Truck
would be incorrect, since according to the updated model 1
is now Van
.
回答1:
No, Migrations does not fully support enum changes since it does not update the database values to reflect changes such as altered order, additions or removals.
Adding enum values while preserving the order will have no effect. In fact, it will not even fire a model backing change error.
If the order of the CarType
enum changes, then the database data will effectively be invalid. The original int
values are preserved, but the enum results will be wrong.
In order to accommodate this type of change, manual processing of the database data will be necessary. In this specific example, custom SQL will have to be run that changes the values of the Type
column according to the enum changes:
public partial class CarTypeChange : DbMigration
{
public override void Up()
{
// 1 now refers to "VAN", and 2 now refers to "Truck"
Sql("Update cars Set [Type] = 2 Where [Type] = 1");
}
public override void Down()
{
Sql("Update cars Set [Type] = 1 Where [Type] = 2");
}
}
Addendum: I've asked another question related to this: Handling enum changes in Entity Framework 5
来源:https://stackoverflow.com/questions/11909537/does-the-new-migrations-feature-of-entity-framework-5-fully-support-enum-changes