MVC3中的数据迁移(使用EF.4.3)

时间:2012-07-05 12:26:26

标签: ef-code-first entity-framework-4.3 ef-migrations

我正在为我的项目进行数据迁移。但我有一个问题,例如: 我有以下字段的Book表:

ID  Name   Color

1   Java    red

2   MVC     blue

3   .Net    blue

我尝试使用Code First技术将字段名称从“Color”更改为“BookColor”。但是在迁移之后,表格看起来像这样:

ID  Name   BookColor

1   Java    null

2   MVC     null

3   .Net    null

我丢失了我的字段值。我怎样才能确保所有价值都被转移?

我正在使用带有MVC3的实体框架

编辑这是我的DBMigration类:

public partial class AddCreative : DbMigration
{

    public override void Up()
    {
        AddColumn("Authors", "Names", c => c.String(maxLength: 4000));
        DropColumn("Authors", "Name");
    }


    public override void Down()
    {
        AddColumn("Authors", "Name", c => c.String(maxLength: 4000));
        DropColumn("Authors", "Names");
    }
}

我在更改后将Name更改为Names(我在名称字段中丢失了数据)。

2 个答案:

答案 0 :(得分:6)

使用以下内容时没有问题:

首先,设置迁移:

PM> Enable-Migrations
PM> Add-Migration RenameBookColorColumn

然后我们设置迁移类来执行重命名:

public class RenameBookColorColumn : DbMigration
{
    public override void Up()
    {
        this.RenameColumn("Books", "Color", "BookColor");
    }
    public override void Down()
    {
        this.RenameColumn("Books", "BookColor", "Color");
    }
}

接下来,拨打Update-Database,以便我们执行更改:

PM> Update-Database -Verbose
Using NuGet project 'Example'.
Using StartUp project 'ExampleTest'.
Target database is: 'ExampleContext' (DataSource: .\SQLEXPRESS, Provider: System.Data.SqlClient, Origin: Convention).
Applying explicit migrations: [201207051400010_RenameBookColorColumn].
Applying explicit migration: 201207051400010_RenameBookColorColumn.
EXECUTE sp_rename @objname = N'Books.Color', @newname = N'BookColor',
@objtype = N'COLUMN' [Inserting migration history record]

瞧,它被重命名,数据被保留。

答案 1 :(得分:1)

您可以使用以下代码解决限制。

public partial class AddCreative : DbMigration
{
    public override void Up()
    {
        AddColumn("Authors", "Names", c => c.String(maxLength: 4000));
        Sql("UPDATE [Authors] SET [Names] = [Name]");
        DropColumn("Authors", "Name");
    }

    public override void Down()
    {
        AddColumn("Authors", "Name", c => c.String(maxLength: 4000));
        Sql("UPDATE [Authors] SET [Name] = [Names]");
        DropColumn("Authors", "Names");
    }
}