实体框架迁移。将布尔列更新为枚举

时间:2015-02-11 13:20:10

标签: c# sql-server entity-framework

我有一个生产数据库,其表格的布尔字段为0,1

现在我需要将这些字段的设置更新为枚举。

这可能吗?我会丢失数据吗?

我可以将对应字段添加到布尔值。

我正在去机场的路上,我没有尝试任何东西,但我真的很好奇是否可以这样做。

3 个答案:

答案 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 }
            );

结果(之前和之后):

Migrating property from bool to enum

我希望这会有所帮助。

否则,您始终可以使用Schema Compare生成的脚本替换迁移内容。 SC更聪明。它经常创建用于迁移数据的时态表,并为您处理所有“drop&amp; create constraint”。

答案 1 :(得分:0)

布尔值是一个隐式整数,所以......你可以在不丢失数据的情况下进行转换。 当然,谈论数据。如果您通过任何数据库框架进行映射,则必须正确重新映射

答案 2 :(得分:0)

C#中的

bool类型不是有效的基础枚举类型。您可以用作基础类型的最小类型是byte。但是(AFAIR)byte类型映射到Sql Server端的tinyint而不是bit类型。首先,您必须将数据库中的bit列转换为tinyint,然后更改模型以使用其基础类型为byte的枚举,该属性现在为{{1} }}。最后,确保枚举值与数据库中的数字相对应。默认情况下,枚举值从0开始,因此您应该没有明确定义值。

相关问题