2012-06-19 47 views
7

我正在使用EF 4.3.1代碼優先遷移。我有一個表如:EF遷移:將表格從2列PK移動到單列導致ALTER在DROP之前失敗並且失敗

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; } 
}​ 

我有用上面的代碼創建的現有表。然後我把它移到一個單列主鍵:

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

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

這使得EF在未來的自動遷移失敗,抱怨:

ALTER TABLE [產品] ALTER COLUMN [存儲]爲nvarchar

對象'PK_Product'依賴於'Store'列。 ALTER TABLE ALTER COLUMN存儲失敗,因爲一個或多個對象訪問此列 列。

顯然,在嘗試觸發此ALTER語句(爲什麼它會更改列?)之前需要先刪除PK_Product,但遷移失敗。

我做錯了什麼或這是一個錯誤?解決方法?

回答

13

您將無法通過自動遷移來完成此操作。您必須使用Add-Migration創建遷移,然後更改它,以便僅修改PK。

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被改變列,因爲,當它是一個Key的一部分,它的隱含NOT NULL

的遷移可以很簡單。 您可以保持原樣,添加[Required]屬性,或允許EF在刪除PK之後更改列

+0

添加遷移預生成了上述命令(以及更多)。事實證明,它們只是無序 - 通過在列更改之前移動DropPrimaryKey(如上所述),它已解決。所以爲了清楚起見,最終遷移到了DropPrimaryKey,AlterColumn和AddPrimaryKey。考慮到解決方案的簡單性,我認爲這是Migrations中的一個錯誤,而不是固有的限制。 –

+0

是的,因此我** **在「之後」:-) –