[英]EF5 Code First - Changing A Column Type With Migrations
我是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));
但是当我运行更新数据库时,出现错误
Conversion failed when converting the nvarchar value 'London' to data type int.
迁移中是否有办法在运行alter语句之前截断该表?
我知道我可以打开数据库并手动进行操作,但是有没有更聪明的方法?
最聪明的方法可能是不更改类型。 如果您需要执行此操作,建议您执行以下步骤:
Sql()
通过更新语句从原始列中接管数据 所有这些都可以在同一迁移中完成,将创建正确的SQL脚本。 如果要丢弃数据,可以跳过步骤2。 如果要接管,请添加适当的语句(也可以包含switch语句)。
不幸的是,代码优先迁移并没有提供更简便的方法来完成此任务。
这是示例代码:
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");
基于@JustAnotherUserYouMayKnow的答案,但比较容易。
首先尝试执行Sql()
命令,然后执行AlterColumn()
:
Sql(@"
UPDATE dbo.People
SET Location =
CASE Location
WHEN 'London' THEN 1
WHEN 'Edinburgh' THEN 2
WHEN 'Cardiff' THEN 3
ELSE 0
END
");
AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));
我知道这并不直接适用于该问题,但可能会对某人有所帮助。 在我的问题中,我不小心将年字段设置为日期时间,并且试图找出如何删除所有数据,然后将数据类型切换为整数。
进行添加迁移时,EF只想更新列。 我必须删除他们想做的事情,并添加我自己的代码。 我基本上只是删除了该列并添加了一个新列。 这对我有用。
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "TestingPeriodYear",
table: "ControlActivityIssue");
migrationBuilder.AddColumn<int>(
name: "TestingPeriodYear",
table: "ControlActivityIssue",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "TestingPeriodYear",
table: "ControlActivityIssue");
migrationBuilder.AddColumn<DateTime>(
name: "TestingPeriodYear",
table: "ControlActivityIssue",
nullable: true);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.