如何在没有丢失数据重命名实体框架5个首先迁移数据库列?(How to rename a databa

2019-08-02 01:32发布

我得到了默认的ASP.NET MVC 4模板与EF 5.0代码首先迁移成功运行。 然而,当我更新模型属性的名称,相应的表列数据是由EF 5.0下降。

是它在某种程度上可以不以自动的方式丢弃数据表列重命名?

Answer 1:

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



Answer 2:

前面已经说了 ,更换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");
        }
    }
}


Answer 3:

可以迁移调用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");
    }

如果你希望你的财产和数据库列是相同的名称,您可以稍后重命名属性和删除Column的属性。



Answer 4:

现在,这个答案是根据我EF4.3的知识,所以我希望迁移工作大致EF5一样:)你已经创建了一个迁移后,你应该能够在向上和向下的方法添加代码,之间老物业的下降和新属性的创建。 此代码应在正确的方向上移动特性数据。 我在这里可以输入原始SQL来执行数据移动的SQL()方法来解决它。

在迁移的up方法:

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

并在向下()方法:

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

这种方法的缺点是,你可能对夫妇的代码与你在做什么工作的(因为你写的原始DB-特定SQL)数据库。 可能有可用于数据转移的其他方法为好。

更多信息请访问: MSDN



Answer 5:

添加到乔希加拉格尔的答案:

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

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

但是,实际上将包括在新的列名的括号内。

DbMigration的RenameColumn()方法可能会做同样的,所以避免指定新的列名时使用括号。

此外,在向上的自动生成的命令()&向下()包括DropPrimaryKey()和AddPrimaryKey()如果​​要重命名的列是主键的一部分。 使用RenameColumn时,这些不需要()。 如果所需的基本sp_RENAME自动更新的主键。



Answer 6:

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

  1. 第一步,添加ColumnAttribute您的列被改为以上,然后更新数据库命令

[柱( “内容”)]
公共字符串描述{设置; 得到; }

  1. 第二步骤中,

    • 为了创建部分类DbMigration添加迁移yournamechange命令。

    • 加入到了,在这里上下方法

RenameColumn( “yourDatabase”, “姓名”, “了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在财产法在模型上面沟通。



Answer 7:

像+乔什Gallagher表示,最多可以使用()做的事情,如:

public override void Up()
        {

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

        }

我找到了这个在刚开到迁移有很好的帮助;)



文章来源: How to rename a database column in Entity Framework 5 Code First migrations without losing data?