11

這個問題已被多次提出在SO上的不同口味。我經歷了所有的答案,並且耗費了大量的時間。我似乎無法得到這個工作。代碼優先遷移 - 實體框架 - 無法將列添加到表

我一直在研究asp.net mvc實體框架,SQL服務器應用程序。我已經有了一個現有的數據庫,表格等等,而且每件事情都在起作用。我只需要在表格中添加一個新列。

所以..我在模型類中添加了一個屬性,以便我可以將該列添加到表中。但沒有成功。

所以我按照以下順序執行這些步驟。

  1. 添加我的模型類中的字段。

    [Required] 
    public string EmailSubject{ get; set; } 
    
  2. 然後我刪除我的asp.net MVC項目包含Configuration.cs類
  3. 然後在包管理器控制檯的文件夾遷移,我發出成功以下命令。

    Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force 
    
  4. 然後,我設置屬性真如下

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = true; 
    } 
    
  5. 然後我發出的包管理器控制檯執行以下命令。

    Update-Database -Verbose -Force 
    

這裏是我的連接字符串默認連接到數據庫看起來像

Data Source=(LocalDb)\v11.0;AttachDbFilename=C:\practice\AppointmentReminder4\AppointmentReminder4\App_Data\aspnet-AppointmentReminder4-20141202060615.mdf;Initial Catalog=aspnet-AppointmentReminder4-20141202060615;Integrated Security=True 

但我無法對我的期望表中添加新列。


編輯1

我的模型更新,而不需要的屬性如下,並執行所有上述步驟,但我仍然無法將列添加到表中。

public string EmailBody { get; set; } 

以下是所有命令及其輸出。

PM> Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force 
Checking if the context targets an existing database... 
Code First Migrations enabled for project AppointmentReminder4. 
PM> Update-Database -Verbose -Force 
Using StartUp project 'AppointmentReminder4'. 
Using NuGet project 'AppointmentReminder4'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'aspnet-AppointmentReminder4-20141202060615' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration). 
No pending explicit migrations. 
Running Seed method. 
PM> Update-Database -Verbose -Force 
Using StartUp project 'AppointmentReminder4'. 
Using NuGet project 'AppointmentReminder4'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'aspnet-AppointmentReminder4-20141202060615' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration). 
No pending explicit migrations. 
Running Seed method. 
PM> 

編輯2 終於解決了這個問題。我上面的所有步驟都是正確的。除了我編輯我的模型類,而不是實際綁定到ReminderDb(EF對象)的實際數據類。在我用屬性更新了正確的類後,每件事情都成功了。感謝所有那些迴應幫助的人!

+0

雖然我已經回答了,我認爲答案是什麼,你應該表現出什麼樣的錯誤你得到。 – 2015-01-20 20:28:35

回答

11

因爲該字段是必需的,所以您需要指定一個默認值。編輯您的遷移文件,找到這一行加入你的專欄,並指定默認值應該是什麼:

public override void Up() 
{  
    AddColumn("dbo.MyTable", "EmailSubject", c => c.String(nullable: false, defaultValue: "")); 
} 

參考: Default value for Required fields in Entity Framework migrations?

編輯:根據您的編輯,你需要創建在嘗試更新之前進行遷移。請參閱this example以瞭解您通常如何使用它。

不過,如果你想的Code First遷移應用到現有的數據庫,這篇文章可以幫助:Code First Migrations with an existing database

+0

刪除所需的屬性後仍然沒有更新 – 2015-01-20 21:30:42

+0

@ dotnet-practitioner您'不要在任何地方進行「添加遷移」,所以它沒有任何東西可以應用。看到我上面的更新。 – 2015-01-20 21:34:59

5

您用新的屬性裝飾了新列。如果該表已經有一些行,則這些行不能包含該列。 需要移除。與遷移相比,使用數據填充所有行。 設置屬性並重新遷移。

+2

這可能是正確的答案。您需要刪除所需的屬性,遷移,設置現有列的值,添加必需的屬性,再次遷移 – pquest 2015-01-20 20:20:46

+0

刪除所需的屬性後仍然沒有更新 – 2015-01-20 21:29:13

相關問題