簡體   English   中英

如何在不丟失數據的情況下重命名 Entity Framework 5 Code First 遷移中的數據庫列?

[英]How to rename a database column in Entity Framework 5 Code First migrations without losing data?

我使用 EF 5.0 Code First Migrations 成功運行了默認的 ASP.NET MVC 4 模板。 但是,當我更新模型屬性名稱時,EF 5.0 會刪除相應的表列數據。

是否可以在不以自動方式刪除數據的情況下重命名表列?

手動編輯遷移的 Up 和 Down 方法以使用RenameColumn方法替換它自動為您生成的AddColumnDropColumn

如前所述,用DropColumn替換自動生成的AddColumnRenameColumn

例子:

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");
        }
    }
}

如果您這樣做,您可以讓遷移為您調用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屬性。

您有 2 個步驟來重命名代碼第一次遷移中的列

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

[列(“內容”)]
公共字符串 描述 { 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");
  }

因為當您連接時,您的數據庫和模型類將通過上面模型中的數據庫中的 name_column 和屬性方法中的 name_type 進行通信。

現在,這個答案是基於我對 EF4.3 的了解,所以我希望遷移在 EF5 中的工作大致相同:) 創建遷移后,您應該能夠在 Up 和 Down 方法中添加代碼,在舊財產的丟棄和新財產的創建。 此代碼應將屬性數據移動到正確的方向。 我已經使用 SQL() 方法解決了這個問題,您可以在其中輸入原始 SQL 來執行數據移動。

在遷移的 Up 方法中:

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

在 Down() 方法中:

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

這種方法的缺點是您可能會將您的代碼與您目前正在使用的數據庫耦合(因為您正在編寫原始數據庫特定的 SQL)。 可能還有其他方法可用於數據移動。

此處提供更多信息: MSDN

添加喬什加拉格爾的回答:

在某些地方,sp_RENAME 語法是這樣描述的:

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

但是,這實際上將包括新列名稱中的括號。

DbMigration 的 RenameColumn() 方法可能會執行相同的操作,因此在指定新列名時避免使用方括號。

此外,如果被重命名的列是主鍵的一部分,則 Up() 和 Down() 中自動生成的命令包括 DropPrimaryKey() 和 AddPrimaryKey()。 使用 RenameColumn() 時不需要這些。 如果需要,基礎 sp_RENAME 會自動更新主鍵。

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

migrationBuilder.RenameColumn(
                                name: "oldname",
                                table: "tablename",
                                newName: "newname",
                                schema: "schema");

就像 +Josh Gallagher 所說的,你可以使用 up() 來做這樣的事情:

public override void Up()
        {

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

        }

我發現對開始遷移很有幫助;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM