Entity Framework 5 的新迁移功能是否完全支持枚举更改? [英] Does the new Migrations feature of Entity Framework 5 fully support enum changes?

查看:22
本文介绍了Entity Framework 5 的新迁移功能是否完全支持枚举更改?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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,当向数据库添加一个新的Car 对象时,会将CarType 枚举值存储为一个整数.

Entity Framework, when adding a new Car object to the database, will store the CarType enum value as an integer.

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

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?

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

For example, let's say we added another value to CarType:

public enum CarType
{
    Car, Truck, Van
}

这不会对数据库中的现有数据产生实际影响.0 仍然是 Car,而 1 仍然是 Truck.但是如果我们改变CarType的顺序,像这样:

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
}

1 作为CarType 指定Truck 的数据库记录是不正确的,因为根据更新的模型1 现在是 Van.

Database records with 1 as the CarType to designate Truck would be incorrect, since according to the updated model 1 is now Van.

推荐答案

不,Migrations 完全支持枚举更改,因为它不会更新数据库值以反映更改,例如更改的顺序、添加或搬迁.

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.

如果CarType 枚举的顺序发生变化,那么数据库数据实际上将无效.原始的 int 值被保留,但枚举结果将是错误的.

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.

为了适应这种类型的更改,需要手动处理数据库数据.在此特定示例中,必须运行自定义 SQL,根据枚举更改更改 Type 列的值:

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

<小时>

附录:我问了另一个与此相关的问题:处理枚举更改在实体框架 5 中

这篇关于Entity Framework 5 的新迁移功能是否完全支持枚举更改?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆