我首先在我的项目中使用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”列,表'';列不允许空值。更新失败。 声明已经终止。
请提出解决方案。
答案 0 :(得分:11)
那是因为您在该列中允许NULL
个值,然后尝试使其不可为空。随后它会尝试将您现有的数据迁移到新的非可空列中,该列会因为您已经有NULL
值而中断。
两种解决方案:
1)将其更改为可空的
2)为没有值的项目提供默认值。
答案 1 :(得分:2)
如果未为该列提供默认值,则不能直接向该表中具有历史数据的表添加不可空列。
我要做的是
代码示例(带有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));
}