Entity Framework 5 的新迁移功能是否完全支持枚举更改? [英] Does the new Migrations feature of Entity Framework 5 fully support enum changes?
问题描述
假设我们有以下简单模型:
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屋!