11

假设我们有以下简单模型:

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
}

实体框架在向数据库添加新Car对象时,会将CarType枚举值存储为整数。

如果我们CarType以整数值更改的方式更改枚举(更改顺序或添加/删除值),Entity Framework 是否知道如何使用 Migrations 正确处理数据迁移?


例如,假设我们添加了另一个值CarType

public enum CarType
{
    Car, Truck, Van
}

这对数据库中的现有数据没有实际影响。0还在Car1现在还在Truck。但是如果我们改变 的顺序CarType,像这样:

public enum CarType
{
    Car, Van, Truck
}

1使用asCarType指定的数据库记录Truck是不正确的,因为根据更新的模型1是 now Van

4

1 回答 1

8

不,迁移完全支持枚举更改,因为它不会更新数据库值以反映更改的顺序、添加或删除等更改。

在保留顺序的同时添加枚举值将无效。事实上,它甚至不会触发模型支持更改错误。

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

附录:我问过另一个与此相关的问题:Handling enum changes in Entity Framework 5

于 2012-08-13T20:34:07.077 回答