代码优先迁移 - 实体框架 - 无法向表中添加列

dot*_*ner 16 c# asp.net asp.net-mvc entity-framework ef-migrations

这个问题已经多次以不同的口味问过SO.我已经完成了所有的答案,并且耗费了大量的时间.我似乎无法让这个工作.

我一直在研究asp.net mvc Entity Framework,SQL server app.我已经有了一个现有的数据库,表格等,而且每件事都有效.我只需要在表格中添加一个新列.

所以..我在模型类中添加了一个属性,以便我可以将列添加到表中.但没有成功.

所以我按以下顺序执行这些步骤.

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

    [Required]
    public string EmailSubject{ get; set; }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后我删除包含Configuration.cs类的asp.net mvc项目中的迁移文件夹
  3. 然后在Package Manager Console中,我成功发出以下命令.

    Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后我将属性设置为true,如下所示

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 然后我在包管理器控制台中发出以下命令.

    Update-Database -Verbose -Force
    
    Run Code Online (Sandbox Code Playgroud)

以下是我与数据库的默认连接的连接字符串

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

但我无法在我想要的表中添加新列.


编辑1

我更新了模型如下,没有必需的属性,并执行了上述所有步骤,但我仍然无法将列添加到表中.

public string EmailBody { get; set; }
Run Code Online (Sandbox Code Playgroud)

以下是所有命令及其输出.

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> 
Run Code Online (Sandbox Code Playgroud)

编辑2 最后解决了这个问题.我上面的所有步骤都是正确的.除了我正在编辑我的模型类,而不是实际绑定到ReminderDb(EF对象)的实际数据类.在我用属性更新了正确的类之后,每件事都成功了.感谢所有回复帮助的人!

Wil*_*ins 15

由于该字段是必需的,因此您需要指定默认值.编辑迁移文件,找到添加列的行,并指定默认值应为:

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

供参考: Entity Framework迁移中必填字段的默认值?

编辑:根据您的编辑,您需要在尝试更新之前创建迁移.请参阅此示例,了解您通常如何使用它.

但是,如果您尝试将代码优先迁移应用于现有数据库,本文可能会有所帮助:使用现有数据库进行代码优先迁移


tmg*_*tmg 6

您使用required属性修饰了新列.如果该表已经有一些行,则这些行不能包含该列.删除所需.比迁移,用数据填充所有行.使属性成为必需并再次迁移.

  • 这可能是正确的答案.您需要省略所需属性,迁移,设置现有列的值,添加所需属性,再次迁移 (3认同)