Изменена ли новая функция Migrations для Entity Framework 5?

Скажем, мы имеем следующую простую модель:

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 при добавлении нового объекта Car в базу данных сохранит значение CarType enum как целое число.

Если мы изменим перечисление CarType таким образом, чтобы значения целочисленного значения изменялись (изменяли порядок или добавляли/удаляли значения), действительно ли Entity Framework умеет правильно обрабатывать миграцию данных с помощью Migrations?


Например, допустим, мы добавили другое значение в CarType:

public enum CarType
{
    Car, Truck, Van
}

Это не повлияет на существующие данные в базе данных. 0 все еще Car, а 1 все еще Truck. Но если мы изменили порядок CarType, вот так:

public enum CarType
{
    Car, Van, Truck
}

Записи базы данных с 1 в качестве CarType для обозначения Truck будут неверными, поскольку в соответствии с обновленной моделью 1 теперь Van.

Ответ 1

Нет. Миграции не поддерживают полностью поддержку изменений перечисления, поскольку он не обновляет значения базы данных, чтобы отражать изменения, такие как измененный порядок, добавления или удаления.

Добавление значений перечисления при сохранении порядка не будет иметь эффекта. Фактически, это даже не приведет к ошибке изменения модели поддержки.

Если порядок перечисления CarType изменяется, данные базы данных будут фактически недействительными. Исходные значения int сохраняются, но результаты перечисления будут ошибочными.

Для обеспечения такого типа изменений потребуется ручная обработка данных базы данных. В этом конкретном примере пользовательский SQL должен быть запущен, который изменяет значения столбца Type в соответствии с изменениями перечисления:

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");
    }
}

Приложение: я задал еще один вопрос, связанный с этим: Обработка изменений перечисления в Entity Framework 5