Does the new Migrations feature of Entity Framework 5 fully support enum changes?

浪子不回头ぞ 提交于 2020-01-03 07:20:10

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!