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

后端 未结 8 2107
北海茫月
北海茫月 2021-01-30 10:25

I got the default ASP.NET MVC 4 template successfully running with EF 5.0 Code First Migrations. However, when I update a model property name, the corresponding table column dat

相关标签:
8条回答
  • 2021-01-30 10:34

    Manually edit the Up and Down methods of the migration to use the RenameColumn method to replace the AddColumn and DropColumn that it automatically generates for you.

    0 讨论(0)
  • 2021-01-30 10:34

    Now, this answer is based on my knowledge of EF4.3, so I hope the migrations work roughly the same in EF5 :) After you've created a migration, you should be able to add code in the Up and Down methods, between the dropping of the old property and the creation of the new property. This code should move the property data in the correct direction. I've solved it with the SQL() method in where you can enter raw SQL to perform the data move.

    In the Up method of the migration:

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

    and in the Down() method:

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

    The disadvantage of this approach is that you might couple your code with the database you're working with at the moment (since you're writing raw DB-specific SQL). There might be other methods available for data movement as well.

    More info available here: MSDN

    0 讨论(0)
  • 2021-01-30 10:34

    In Entity Framework Core 3.1.1, If you need to rename a column - Add migration as below

    migrationBuilder.RenameColumn(
                                    name: "oldname",
                                    table: "tablename",
                                    newName: "newname",
                                    schema: "schema");
    
    0 讨论(0)
  • 2021-01-30 10:46

    As already said, replace the AddColumn and DropColumn that is automatically generated with RenameColumn.

    Example:

    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");
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-30 10:46

    Adding to Josh Gallagher's answer:

    In some places the sp_RENAME syntax is described like this:

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

    However, that will actually include the brackets in the new column name.

    DbMigration's RenameColumn() method will probably do the same, so avoid using brackets when specifying the new column name.

    Also, the auto-generated commands in Up() & Down() include DropPrimaryKey() and AddPrimaryKey() if the column being renamed is part of the primary key. These are not needed when using RenameColumn(). The underlying sp_RENAME automatically updates the primary key if needed.

    0 讨论(0)
  • 2021-01-30 10:47

    you have 2 steps to rename column in code first migration

    1. The first step,you add ColumnAttribute above your column which are changed, and then update-database command

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

    1. The second step,

      • add-migration yournamechange command in order to create a partial class DbMigration.

      • add into up and down method here

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

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

    Because when you connect, your database and model class will communicate via name_column at database and name_type at property method in model above.

    0 讨论(0)
提交回复
热议问题