我有一个生产数据库,其表格的布尔字段为0,1
现在我需要将这些字段的设置更新为枚举。
这可能吗?我会丢失数据吗?
我可以将对应字段添加到布尔值。
我正在去机场的路上,我没有尝试任何东西,但我真的很好奇是否可以这样做。
答案 0 :(得分:2)
我刚刚使用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)在Seed方法中插入一些行:
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 }
);
结果(之前和之后):
我希望这会有所帮助。
否则,您始终可以使用Schema Compare生成的脚本替换迁移内容。 SC更聪明。它经常创建用于迁移数据的时态表,并为您处理所有“drop&amp; create constraint”。
答案 1 :(得分:0)
布尔值是一个隐式整数,所以......你可以在不丢失数据的情况下进行转换。 当然,谈论数据。如果您通过任何数据库框架进行映射,则必须正确重新映射
答案 2 :(得分:0)
bool
类型不是有效的基础枚举类型。您可以用作基础类型的最小类型是byte
。但是(AFAIR)byte
类型映射到Sql Server端的tinyint
而不是bit
类型。首先,您必须将数据库中的bit
列转换为tinyint
,然后更改模型以使用其基础类型为byte
的枚举,该属性现在为{{1} }}。最后,确保枚举值与数据库中的数字相对应。默认情况下,枚举值从0开始,因此您应该没有明确定义值。