我有一个生产数据库,其中有一个布尔字段为0,1实体框架迁移。更新布尔列以枚举
现在我需要更新设置这些字段为枚举。
这可能吗?我失去了数据吗?
我可以有对应的字段布尔值。
我正在去机场的路上,我没有试过任何东西,但我真的好奇,如果这可以做到。
我有一个生产数据库,其中有一个布尔字段为0,1实体框架迁移。更新布尔列以枚举
现在我需要更新设置这些字段为枚举。
这可能吗?我失去了数据吗?
我可以有对应的字段布尔值。
我正在去机场的路上,我没有试过任何东西,但我真的好奇,如果这可以做到。
使用EF 6.1.2我刚刚试过此我自己:
1)增加了一个布尔列一类:
public class Company
{
public int Id { get; set; }
[Required, StringLength(100)]
public string Name { get; set; }
public DbGeography Location { get; set; }
public bool ColumnToConvert { get; set; }
}
2)中产生的相应的迁移:
public partial class AddBooleanProperty : DbMigration
{
public override void Up()
{
AddColumn("dbo.Company", "ColumnToConvert", c => c.Boolean(nullable: false, defaultValue: true));
}
public override void Down()
{
DropColumn("dbo.Company", "ColumnToConvert");
}
}
3)插入一些行中的种子的方法:
ctx.Companies.AddOrUpdate<Company>(
c => c.Name,
new Company { Name = "Company 1", ColumnToConvert = true },
new Company { Name = "Company 2", ColumnToConvert = false },
new Company { Name = "Company 3", ColumnToConvert = true }
);
4)改变从BOOL到EnumExample属性类型:
public EnumExample ColumnToConvert { get; set; }
其中EnumExample是:
public enum EnumExample
{
False,
True,
OtherValue,
AnotherValue
}
5)产生的新的迁移:
public override void Up()
{
Sql("ALTER TABLE dbo.Company DROP CONSTRAINT DF__Company__ColumnT__47DBAE45"); // Manually added
AlterColumn("dbo.Company", "ColumnToConvert", c => c.Int(nullable: false, defaultValue: 2));
}
public override void Down()
{
Sql("ALTER TABLE dbo.Company DROP CONSTRAINT DF__Company__ColumnT__47DBAE45"); // Manually added
AlterColumn("dbo.Company", "ColumnToConvert", c => c.Boolean(nullable: false, defaultValue: true));
}
在这里,我意识到我必须手动删除DF约束,因为当我运行迁移时,它给了我一个错误告诉我该列取决于约束条件。
6)然后我修改种子法:
ctx.Companies.AddOrUpdate<Company>(
c => c.Name,
new Company { Name = "Company 4", ColumnToConvert = EnumExample.AnotherValue },
new Company { Name = "Company 5", ColumnToConvert = EnumExample.OtherValue },
new Company { Name = "Company 6", ColumnToConvert = EnumExample.True }
);
RESULT(前后):
我希望这有助于。
否则,您始终可以用Schema Compare生成的脚本来替换您的迁移内容。 SC更聪明。它通常会创建临时表来迁移数据,并且会为您处理所有“创建约束条件”。
我其实也是这样做的,它的工作。感谢澄清。 – DarthVader 2015-02-11 22:35:44
布尔是一个隐式整数,所以...你可以做转换而不会丢失数据。 当然,谈论数据。如果您通过任何数据库架构映射,you'll必须正确重新映射
bool
C#中的类型不是有效的基础枚举类型。您可以用作底层类型的最小类型是byte
。但(AFAIR)byte
类型映射到tinyint
而不是bit
类型在Sql Server端。因此,首先您必须将数据库中的bit
列转换为tinyint
,然后将您的模型更改为使用基础类型为byte
的枚举,该枚举现在为bool
。最后,确保枚举值对应于数据库中的数字。默认情况下,枚举值从0开始,所以你应该很好,没有明确定义值。
你应该如何将这些布尔值转换为枚举? – 2015-02-11 13:23:41
枚举存储为int否?所以可能会接受转换。 – DarthVader 2015-02-11 13:26:00
您正在使用哪个EF版本? – 2015-02-11 13:26:37