2012-06-19 16 views
7

Tôi đang sử dụng EF 4.3.1 Mã di chuyển đầu tiên. Tôi có một bảng như:Chuyển đổi EF: Di chuyển bảng từ 2 cột PK sang cột đơn gây ALTER trước DROP và không thành công

public class Product 
{ 
    [Key] 
    [Column(Order=0)] 
    [MaxLength(100)] 
    public string Store { get; set; } 

    [Key] 
    [Column(Order=1)] 
    [MaxLength(100)] 
    public string Sku { get; set; } 
}​ 

Tôi có một bảng hiện có được tạo bằng mã trên. Sau đó tôi chuyển nó đến một Primary Key single-cột:

public class Product 
{ 
    [MaxLength(100)] 
    public string Store { get; set; } 

    [Key] 
    [MaxLength(100)] 
    public string Sku { get; set; } 
}​ 

Điều này làm cho EF thất bại trong cuộc di cư tự động tiếp theo, phàn nàn:

ALTER TABLE [sản phẩm] ALTER COLUMN [Lưu trữ] nvarchar

Đối tượng 'PK_Product' phụ thuộc vào cột 'Lưu trữ'. ALTER TABLE ALTER COLUMN Lưu trữ không thành công vì một hoặc nhiều đối tượng truy cập cột này.

Rõ ràng PK_Product cần được xóa trước khi cố gắng kích hoạt câu lệnh ALTER này (tại sao nó thay đổi cột?), Nhưng thay vì di chuyển không thành công.

Tôi có làm gì sai hoặc đây có phải là lỗi không? Cách giải quyết?

Trả lời

13

Bạn sẽ không thể thực hiện việc này với di chuyển tự động. Bạn sẽ phải tạo một di chuyển bằng cách sử dụng Add-Migration và sau đó thay đổi nó để nó chỉ sửa đổi PK.

Việc chuyển có thể đơn giản như:

public partial class TheMigration : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("Products", new[] { "Store", "Sku" }); 
     AddPrimaryKey("Products", "Sku"); 
    } 

    public override void Down() 
    { 
     DropPrimaryKey("Products", new[] { "Sku" }); 
     AddPrimaryKey("Products", new[] { "Store", "Sku" }); 
    } 
} 

EF được thay đổi cột bởi vì, khi đó là một phần của một Key, nó ngầm NOT NULL. Bạn có thể để nguyên trạng thái này, thêm thuộc tính [Required] hoặc cho phép EF thay đổi cột sau khi thả PK.

+0

Thêm-di chuyển được tạo trước các lệnh trên (và hơn thế nữa). Hóa ra chúng đơn giản là không đúng thứ tự - bằng cách di chuyển DropPrimaryKey như bạn đã ở trên đây trước khi thay đổi cột, nó đã được giải quyết. Vì vậy, để được rõ ràng việc di chuyển cuối cùng đã đi DropPrimaryKey, AlterColumn, AddPrimaryKey. Tôi nghĩ rằng đây là một lỗi trong Migrations cho sự đơn giản của giải pháp, chứ không phải là một giới hạn vốn có. –

+0

Yup, do đó ** in đậm ** của tôi trong "sau" :-) –

Các vấn đề liên quan