gpt4 book ai didi

c# - EF5 Code First - 使用迁移更改列类型

转载 作者:IT王子 更新时间:2023-10-29 04:01:04 25 4
gpt4 key购买 nike

我是 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 应用程序添加了一些记录。

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

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. 使用 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");

关于c# - EF5 Code First - 使用迁移更改列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14837168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com