如何在Entity Framework 5 Code First迁移中重命名数据库列而不丢失数据?

Dan*_*nte 68 .net c# entity-framework entity-framework-5

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

是否可以以某种方式重命名表列而不以自动方式删除数据?

Jos*_*her 106

手动编辑迁移到使用的向上和向下的方法RenameColumn来替代方法AddColumnDropColumn它自动为您生成.

  • 请注意其中包含点的表名.`RenameColumn`生成一个`sp_rename` T-SQL语句,它在内部使用`parsename`,它有一些限制.因此,如果你有一个包含点的表名,例如"SubSystemA.Tablename",那么使用:`RenameColumn("dbo.[SubSystemA.Tablename]","OldColumnName","NewColumnName"); (10认同)

Zan*_*non 42

如前所述,替换AddColumnDropColumn自动生成的RenameColumn.

例:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*ess 12

可以得到迁移打电话RenameColumn,如果你为你做这个:

[Column("NewName")]
public string OldName { get; set; }
Run Code Online (Sandbox Code Playgroud)

这是生成的迁移:

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

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

如果希望属性和数据库列名称相同,则可以稍后重命名该属性并删除该Column属性.


Thả*_*ric 5

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

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

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

  1. 第二步,

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

    • 在这里添加上下方法

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

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


public override void Down()
  {
        RenameColumn("dbo.your_database", "newColumn", 
        "oldColumn");
  }
Run Code Online (Sandbox Code Playgroud)

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