2015-02-11 53 views
0

我有一个生产数据库,其中有一个布尔字段为0,1实体框架迁移。更新布尔列以枚举

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

这可能吗?我失去了数据吗?

我可以有对应的字段布尔值。

我正在去机场的路上,我没有试过任何东西,但我真的好奇,如果这可以做到。

+0

你应该如何将这些布尔值转换为枚举? – 2015-02-11 13:23:41

+0

枚举存储为int否?所以可能会接受转换。 – DarthVader 2015-02-11 13:26:00

+0

您正在使用哪个EF版本? – 2015-02-11 13:26:37

回答

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)插入一些行中的种子的方法:

 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(前后):

Migrating property from bool to enum

我希望这有助于。

否则,您始终可以用Schema Compare生成的脚本来替换您的迁移内容。 SC更聪明。它通常会创建临时表来迁移数据,并且会为您处理所有“创建约束条件”。

+0

我其实也是这样做的,它的工作。感谢澄清。 – DarthVader 2015-02-11 22:35:44

0

布尔是一个隐式整数,所以...你可以做转换而不会丢失数据。 当然,谈论数据。如果您通过任何数据库架构映射,you'll必须正确重新映射

0

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