这个问题在SO上已经以不同的风格被问了很多次。我已经浏览了所有的答案并消耗了很多时间。我似乎无法做到这一点。
我一直在研究 asp.net mvc实体框架,SQL服务器应用程序。我已经有一个现有的数据库,表格等,一切都在工作。我只需要在表中添加一个新列。
所以。。我在模型类中添加了一个属性,以便可以将列添加到表中。但没有成功。
因此,我按以下顺序执行这些步骤。
-
在我的模型类中添加字段。
[Required] public string EmailSubject{ get; set; }
- 然后我删除包含配置类的 asp.net mvc 项目中的文件夹迁移.cs
-
然后在程序包管理器控制台中,我成功发出以下命令。
Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
-
然后我按如下方式将属性设置为 true。
public Configuration() { AutomaticMigrationsEnabled = true; }
-
然后我在包管理器控制台中发出以下命令。
Update-Database -Verbose -Force
这是我与数据库的默认连接的连接字符串的样子
Data Source=(LocalDb)v11.0;AttachDbFilename=C:practiceAppointmentReminder4AppointmentReminder4App_Dataaspnet-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 对象)的实际数据类。在我使用该属性更新了正确的类后,每件事都成功了。感谢所有回应帮助的人!
由于该字段是必填字段,因此需要指定默认值。编辑迁移文件,找到添加列的行,并指定默认值应为:
public override void Up()
{
AddColumn("dbo.MyTable", "EmailSubject", c => c.String(nullable: false, defaultValue: ""));
}
供参考:实体框架迁移中必填字段的默认值?
编辑:根据您的编辑,您需要先创建迁移,然后再尝试更新。请参阅此示例,了解您通常如何使用它。
但是,如果您尝试将代码优先迁移应用于现有数据库,本文可能会有所帮助: 使用现有数据库进行代码优先迁移
您使用 required 属性装饰了新列。如果该表已经有一些行,则这些行不能具有该列。删除必需。与迁移相比,用数据填充所有行。将属性设置为必需并再次迁移。