2012-10-27 6 views
51

Tôi đã mặc định mẫu ASP.NET MVC 4 chạy thành công với EF 5.0 Code First Migrations. Tuy nhiên, khi tôi cập nhật tên thuộc tính mô hình, dữ liệu cột bảng tương ứng sẽ bị giảm xuống EF 5.0.Làm cách nào để đổi tên cột cơ sở dữ liệu trong Entity Framework 5 Code Lần di chuyển đầu tiên mà không làm mất dữ liệu?

Bằng cách nào đó có thể đổi tên cột bảng mà không làm rơi dữ liệu theo cách tự động?

Trả lời

88

tay chỉnh sửa các phương pháp Up và Down của việc chuyển đổi sang sử dụng phương pháp RenameColumn để thay thế AddColumnDropColumn rằng nó sẽ tự động tạo cho bạn.

+7

Hãy cẩn thận với các tên bảng có dấu chấm trong đó. 'RenameColumn' tạo ra một câu lệnh T-SQL' sp_rename' sử dụng 'parsename' nội bộ có một số hạn chế. Vì vậy, nếu bạn có tên bảng có dấu chấm trong đó, ví dụ: "SubSystemA.Tablename" sau đó sử dụng: 'RenameColumn (" dbo. [SubSystemA.Tablename] "," OldColumnName "," NewColumnName ");' – Ilan

4

Bây giờ, câu trả lời này dựa trên kiến ​​thức của tôi về EF4.3, vì vậy tôi hy vọng sự di chuyển hoạt động gần như giống nhau trong EF5 :) Sau khi bạn đã tạo di chuyển, bạn sẽ có thể thêm mã trong phần Lên và Phương thức xuống, giữa việc giảm thuộc tính cũ và tạo thuộc tính mới. Mã này sẽ di chuyển dữ liệu thuộc tính theo đúng hướng. Tôi đã giải quyết nó bằng phương thức SQL() ở nơi bạn có thể nhập SQL thô để thực hiện việc di chuyển dữ liệu.

Trong phương pháp Up của di cư:

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

và trong) phương pháp Xuống (:

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

Những bất lợi của phương pháp này là bạn có thể vài mã của bạn với cơ sở dữ liệu bạn đang làm việc với tại thời điểm này (vì bạn đang viết SQL cụ thể cho DB). Có thể có các phương pháp khác có sẵn để di chuyển dữ liệu.

Thông tin thêm có sẵn ở đây: MSDN

2

Thêm vào Josh Gallagher của câu trả lời:

Ở một số nơi cú pháp sp_rename được mô tả như thế này:

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

Tuy nhiên, đó thực sự sẽ bao gồm các dấu ngoặc trong tên cột mới.

Phương thức RenameColumn() của DbMigration có thể sẽ giống nhau, do đó, tránh sử dụng dấu ngoặc vuông khi chỉ định tên cột mới.

Ngoài ra, các lệnh được tạo tự động trong Up() & Down() bao gồm DropPrimaryKey() và AddPrimaryKey() nếu cột được đổi tên là một phần của khóa chính. Đây không cần thiết khi sử dụng RenameColumn(). Sp_RENAME cơ bản tự động cập nhật khóa chính nếu cần.

0

như + Josh Gallagher cho biết, bạn có thể sử dụng lên() để thực hiện những việc như:

public override void Up() 
     { 

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

     } 

tôi đã tìm thấy this một trợ giúp tốt trong gettin vào di cư;)

23

As already said, thay thế AddColumnDropColumn được tạo tự động với RenameColumn.

Ví dụ:

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

Bạn thể được sự di cư để gọi RenameColumn cho bạn nếu bạn làm điều này:

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

Đây là sự di cư tạo:

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

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

Nếu bạn muốn thuộc tính và cột DB của bạn giống nhau tôi, bạn có thể đổi tên thuộc tính sau và xóa thuộc tính Column.

+0

Và chỉ để ném vào một mẹo hữu ích khác, bạn cũng có thể chạy điều này trong Trình quản lý gói Bảng điều khiển: 'Update-Database -Script'. Sau đó, bạn có thể nhận lệnh SQL 'sp_rename' để chạy lúc rảnh rỗi. : D – Jess

1

bạn có 2 bước để đổi tên cột trong mã di cư đầu tiên

  1. Bước đầu tiên, bạn thêm ColumnAttribute trên cột của bạn được thay đổi, và sau đó cập nhật cơ sở dữ liệu lệnh

[ Cột ("Nội dung")]
chuỗi công khai Mô tả {set; được; }

  1. Bước thứ hai,

    • add-di lệnh yournamechange để tạo ra một lớp DbMigration một phần. thêm

    • thành và phương pháp ở đây

RenameColumn ("yourDatabase", "tên", "newName") xuống;

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


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

Vì khi bạn kết nối, cơ sở dữ liệu và lớp mô hình sẽ giao tiếp qua name_column tại cơ sở dữ liệu và name_type theo phương pháp thuộc tính ở mô hình ở trên.