我将EntityFramework.Migrations(Beta 1)添加到现有的Code-First应用程序中,该应用程序正在进行一些更改(对于我从代码优先API生成的表的迁移功能和更多微调)并进入GETDATE ()场景.
我已经在我的DbContext中使用自定义初始化程序类来运行SQL脚本来设置一些字段并在我的数据库中创建索引.我的几个AlterTable脚本主要用于设置具有默认值的字段(例如某些DateTime字段设置为GETDATE()).我真的希望EntityFramework.Migrations有一个答案,因为你可以很容易地指定defaultValue,但到目前为止我没有看到一个.
有任何想法吗?我真的希望做下面的事情会神奇地起作用.(毕竟这是'神奇的独角兽')
DateCreated = c.DateTime(nullable: false, defaultValue: DateTime.Now)
Run Code Online (Sandbox Code Playgroud)
不幸的是,从逻辑上讲,它将我的默认值设置Update-Database为执行命令的时间.
这个问题已经多次以不同的口味问过SO.我已经完成了所有的答案,并且耗费了大量的时间.我似乎无法让这个工作.
我一直在研究asp.net mvc Entity Framework,SQL server app.我已经有了一个现有的数据库,表格等,而且每件事都有效.我只需要在表格中添加一个新列.
所以..我在模型类中添加了一个属性,以便我可以将列添加到表中.但没有成功.
所以我按以下顺序执行这些步骤.
在我的模型类中添加字段.
[Required]
public string EmailSubject{ get; set; }
Run Code Online (Sandbox Code Playgroud)然后在Package Manager Console中,我成功发出以下命令.
Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
Run Code Online (Sandbox Code Playgroud)然后我将属性设置为true,如下所示
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
Run Code Online (Sandbox Code Playgroud)然后我在包管理器控制台中发出以下命令.
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 …Run Code Online (Sandbox Code Playgroud) 我正在使用EF代码优先迁移。我已经有很多关于生产Db的数据,我想介绍一个不可为空的字段。怎么可能呢?
当前它抛出一个错误:
The column cannot contain null values. [ Column name = Test,Table name = 'MyTable']
Run Code Online (Sandbox Code Playgroud) 我有一个使用OOB数据库初始化程序创建的数据库,我使用的是Code First和EF 4.3.1.
我想利用Add-Migration cmdlet上的新"IgnoreChanges"标志,以便我可以更改一些列并添加默认SQL值.本质上,我的一些实体有一个名为DateLastUpdated的列,我想将DEFAULT设置为sql表达式GETDATE().
我使用"add-migration InitialMigration -ignorechanges"创建了InitialMigration,然后我将以下内容添加到Up()和Down():
public override void Up()
{
AlterColumn("CustomerLocations", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
AlterColumn("UserReportTemplates", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
AlterColumn("Chains", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
}
public override void Down()
{
AlterColumn("CustomerLocations", "DateLastUpdated", c => c.DateTime());
AlterColumn("UserReportTemplates", "DateLastUpdated", c => c.DateTime());
AlterColumn("Chains", "DateLastUpdated", c => c.DateTime());
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试运行"Update-Database -verbose",但我发现它正在尝试在数据库上创建相同的命名默认约束,并且SQL抛出异常:
Applying explicit migrations: [201203221856095_InitialMigration].
Applying explicit migration: 201203221856095_InitialMigration.
ALTER TABLE [CustomerLocations] ADD CONSTRAINT DF_DateLastUpdated DEFAULT GETDATE() FOR [DateLastUpdated]
ALTER TABLE [CustomerLocations] ALTER COLUMN [DateLastUpdated] [datetime] …Run Code Online (Sandbox Code Playgroud)