相关疑难解决方法(0)

可以使用Entity Framework迁移将DateTime字段默认为GETDATE()吗?

我将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为执行命令的时间.

entity-framework-4 ef-code-first ef-migrations

33
推荐指数
4
解决办法
4万
查看次数

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

这个问题已经多次以不同的口味问过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 …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc entity-framework ef-migrations

16
推荐指数
2
解决办法
3万
查看次数

使用EF代码优先迁移将新的必填字段添加到表之一

我正在使用EF代码优先迁移。我已经有很多关于生产Db的数据,我想介绍一个不可为空的字段。怎么可能呢?

当前它抛出一个错误:

The column cannot contain null values. [ Column name = Test,Table name = 'MyTable'] 
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-code-first ef-migrations

8
推荐指数
1
解决办法
2195
查看次数

EF 4.3.1迁移异常 - AlterColumn defaultValueSql为不同的表创建相同的默认约束名称

我有一个使用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)

.net entity-framework ef-migrations entity-framework-4.3

5
推荐指数
2
解决办法
7026
查看次数