EF5 Code First - 通过迁移更改列类型

2024-01-15

我是 EF5 Code First 的新手,在开始工作项目之前我正在修改概念验证。

我最初创建了一个看起来像这样的模型

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public string Location {get;set;}
}

我使用贴在顶部的一个小 MVC 应用程序添加了一些记录。

现在我想将位置列更改为枚举,例如:

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public Locations Location {get;set;}
}

public enum Locations {
  London = 1,
  Edinburgh = 2,
  Cardiff = 3
}

当我添加新的迁移时,我得到:

AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));

但是当我运行 update-database 时出现错误

Conversion failed when converting the nvarchar value 'London' to data type int.

迁移中有没有办法在运行 alter 语句之前截断表?

我知道我可以打开数据库并手动执行此操作,但是有更聪明的方法吗?


最聪明的方法可能是不改变类型。如果您需要这样做,我建议您执行以下步骤:

  1. 使用您的新类型添加新列
  2. Use Sql()使用更新语句接管原始列中的数据
  3. 删除旧列
  4. 重命名新列

这一切都可以在同一个迁移中完成,将创建正确的 SQL 脚本。如果您希望丢弃数据,可以跳过步骤 2。如果您想接管它,请添加适当的语句(也可以包含 switch 语句)。

不幸的是,Code First 迁移没有提供更简单的方法来实现这一点。

这是示例代码:

AddColumn("dbo.People", "LocationTmp", c => c.Int(nullable: false));
Sql(@"
    UPDATE dbp.People
    SET LocationTmp =
        CASE Location
            WHEN 'London' THEN 1
            WHEN 'Edinburgh' THEN 2
            WHEN 'Cardiff' THEN 3
            ELSE 0
        END
    ");
DropColumn("dbo.People", "Location");
RenameColumn("dbo.People", "LocationTmp", "Location");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF5 Code First - 通过迁移更改列类型 的相关文章

随机推荐