实体框架代码首先使列不可为空

时间:2013-09-02 08:46:44

标签: c# sql entity-framework

我首先在我的项目中使用EF代码。我的DataModel中有以下代码

[HiddenInput(DisplayValue = false)]        
public DateTime? PasswordDate { get; set; }

为了使这个不可为空的我删除'?'并从程序包管理器控制台运行Add-Migration命令。生成了以下迁移文件。

  public partial class PasswordDate : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.CertificateInfoes", "PasswordDate", c => c.DateTime(nullable: false));
    }

    public override void Down()
    {
        AlterColumn("dbo.CertificateInfoes", "PasswordDate", c => c.DateTime());
    }
}

但是当我运行Update-Database命令时:

Update-Database -SourceMigration 201309020721215_PasswordDate

我收到以下错误:无法将值NULL插入“PasswordDate”列,表'';列不允许空值。更新失败。 声明已经终止。

请提出解决方案。

2 个答案:

答案 0 :(得分:11)

那是因为您在该列中允许NULL个值,然后尝试使其不可为空。随后它会尝试将您现有的数据迁移到新的非可空列中,该列会因为您已经有NULL值而中断。

两种解决方案:

1)将其更改为可空的
2)为没有值的项目提供默认值。

答案 1 :(得分:2)

如果未为该列提供默认值,则不能直接向该表中具有历史数据的表添加不可空列。

我要做的是

  1. 将该列添加为可为空。
  2. 提供一个sql脚本来填充此新添加的列。
  3. 更改要设为不可空的列。

代码示例(带有postgres数据库):

 public override void Up()
    {            
        AddColumn("public.YourTableName", "YourColumnName", c => c.Int(nullable: true));
        Sql(@"UPDATE ""public"".""YourTableName""
              SET ""YourColumnName"" = Value you want to set
            ");

        AlterColumn("public.YourTableName", "YourColumnName", c => c.Int(nullable: false));
    }