Code First 迁移 - Entity Framework - 无法将列添加到 table

Code First Migration - Entity Framework - unable to add column to the table

这个问题已经在 SO 上以不同的方式被问过很多次了。我已经完成了所有的答案并且浪费了很多时间。我似乎无法正常工作。

我一直在开发 asp.net mvc Entity Framework、SQL 服务器应用程序。我已经有一个现有的数据库,tables 等,一切正常。我只需要向 table 添加一个新列。

所以.. 我在模型 class 中添加了一个 属性,这样我就可以将列添加到 table。但没有成功。

所以我按以下顺序执行步骤。

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

    [Required]
    public string EmailSubject{ get; set; }
    
  2. 然后我删除了我的 asp.net mvc 项目中包含 Configuration.cs class
  3. 的文件夹 Migrations
  4. 然后在程序包管理器控制台中,我成功发出以下命令。

    Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
    
  5. 然后我设置 属性 true 如下

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
    
  6. 然后我在包管理器控制台中发出以下命令。

    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

但我无法在我想要的 table 中添加新列。


编辑 1

我在没有所需属性的情况下按如下方式更新了模型并执行了上述所有步骤,但我仍然无法将列添加到 table。

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 终于解决了这个问题。我上面的所有步骤都是正确的。除了我正在编辑我的模型 class 而不是实际绑定到 ReminderDb(EF 对象)的实际数据 class。在我用 属性 更新了正确的 class 之后,一切都成功了。感谢所有回复帮助的人!

您用必需的属性修饰了新列。如果 table 已经有一些行,那些行不能有该列。 删除所需。与迁移相比,用数据填充所有行。 使 属性 成为必需项并再次迁​​移。

由于该字段为必填项,您需要指定一个默认值。编辑您的迁移文件,找到添加您的列的行,并指定默认值应该是什么:

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