76

我使用 EF 5.0 Code First 迁移成功运行了默认的 ASP.NET MVC 4 模板。但是,当我更新模型属性名称时,EF 5.0 会删除相应的表列数据。

是否可以在不以自动方式删除数据的情况下重命名表列?

4

8 回答 8

117

手动编辑迁移的 Up 和 Down 方法以使用它自动为您生成的RenameColumn替换方法。AddColumnDropColumn

于 2012-11-29T00:41:26.487 回答
47

如前所述,将自动生成的AddColumnand替换为.DropColumnRenameColumn

例子:

namespace MyProject.Model.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class RenameMyColumn : DbMigration
    {
        public override void Up()
        {
            // Remove the following auto-generated lines
            AddColumn("dbo.MyTable", "NewColumn", c => c.String(nullable: false, maxLength: 50));
            DropColumn("dbo.MyTable", "OldColumn");

            // Add this line
            RenameColumn("dbo.MyTable", "OldColumn", "NewColumn");
        }

        public override void Down()
        {
            // Remove the following auto-generated lines
            AddColumn("dbo.MyTable", "OldColumn", c => c.String(nullable: false, maxLength: 50));
            DropColumn("dbo.MyTable", "NewColumn");

            // Add this line
            RenameColumn("dbo.MyTable", "NewColumn", "OldColumn");
        }
    }
}
于 2015-12-23T23:03:51.997 回答
26

如果您这样做,您可以让迁移呼叫您:RenameColumn

[Column("NewName")]
public string OldName { get; set; }

这是生成的迁移:

    public override void Up()
    {
        RenameColumn(table: "Schema.MyTable", name: "OldName", newName: "NewName");
    }

    public override void Down()
    {
        RenameColumn(table: "Schema.MyTable", name: "NewName", newName: "OldName");
    }

如果您希望您的属性和 DB 列同名,您可以稍后重命名该属性并删除该Column属性。

于 2017-01-19T19:31:36.873 回答
5

您有 2 个步骤来重命名代码第一次迁移中的列

  1. 第一步,在更改的列上方添加 ColumnAttribute,然后使用 update-database 命令

[Column("Content")]
public string Description { set; 得到; }

  1. 第二步,

    • add-migration yournamechange 命令以创建分部类 DbMigration。

    • 在此处添加 up 和 down 方法

RenameColumn("yourDatabase","name","newName");

public override void Up()
  {
        RenameColumn("dbo.your_database", "oldColumn",          
       "newColumn");
  }


public override void Down()
  {
        RenameColumn("dbo.your_database", "newColumn", 
        "oldColumn");
  }

因为当您连接时,您的数据库和模型类将通过数据库中的 name_column 和上面模型中的属性方法中的 name_type 进行通信。

于 2017-07-17T05:07:53.683 回答
4

现在,这个答案基于我对 EF4.3 的了解,所以我希望迁移在 EF5 中的工作方式大致相同 :) 创建迁移后,您应该能够在 Up 和 Down 方法中添加代码,介于旧属性的删除和新属性的创建。此代码应将属性数据移动到正确的方向。我已经用 SQL() 方法解决了这个问题,您可以在其中输入原始 SQL 来执行数据移动。

在迁移的 Up 方法中:

SQL("update [TheTable] set [NewColumn] = [OldColumn]");

在 Down() 方法中:

SQL("update [TheTable] set [OldColumn] = [NewColumn]");

这种方法的缺点是您可能会将您的代码与您目前正在使用的数据库结合起来(因为您正在编写原始的特定于 DB 的 SQL)。可能还有其他方法可用于数据移动。

此处提供更多信息:MSDN

于 2012-10-27T22:33:08.310 回答
3

添加到乔什·加拉格尔的答案:

在某些地方 sp_RENAME 语法是这样描述的:

sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'

但是,这实际上将包括新列名中的括号。

DbMigration 的 RenameColumn() 方法可能会做同样的事情,因此在指定新列名时避免使用括号。

此外,如果要重命名的列是主键的一部分,则 Up() 和 Down() 中的自动生成命令包括 DropPrimaryKey() 和 AddPrimaryKey()。使用 RenameColumn() 时不需要这些。如果需要,底层 sp_RENAME 会自动更新主键。

于 2015-03-25T00:19:06.963 回答
3

Entity Framework Core 3.1.1中,如果您需要重命名列 - 添加迁移如下

migrationBuilder.RenameColumn(
                                name: "oldname",
                                table: "tablename",
                                newName: "newname",
                                schema: "schema");
于 2020-07-14T08:31:01.837 回答
0

就像 +Josh Gallagher 所说,您可以使用 up() 来执行以下操作:

public override void Up()
        {

            RenameColumn("dbo.atable","oldname","newname");
            AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));

        }

我发现对开始迁移很有帮助;)

于 2015-08-29T16:26:52.513 回答