使用“代码优先迁移”更新模式时,为现有数据库记录设置默认值

时间:2014-07-08 08:50:29

标签: c# sql asp.net-mvc database-schema ef-migrations

我想将[Required]属性添加到包含 NULL 值的现有数据库记录中,以及使用Code First Migrations自动生成数据库本身的位置。模型架构更新可能如下所示:

public class Product // BEFORE UPDATE
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public string Color { get; set; }
}

public class Product // AFTER UPDATE
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]   // <---- Added
    public string Color { get; set; }
}

然后我运行命令

add-migration MakeColorRequired // Runs successfully
update-database                 // Crashes

后一个命令崩溃,因为它不允许已将 color 元素已设置为 NULL 的现有数据库条目成为必填字段,从而产生错误:< / p>

Cannot insert the value NULL into column 'Color', 
       table 'MySystem.dbo.Product'; 
       column does not allow nulls. 
       UPDATE fails.

有没有办法在不删除数据库的情况下克服这个问题?例如,能够为所有冲突记录设置新的默认值会在我的场景中运行良好,但我还没有找到任何实际的方式。

2 个答案:

答案 0 :(得分:5)

编辑迁移以包含SQL语句,以将该字段为空的所有记录更新为新的默认值。

public override void Up() 
{ 
    Sql("UPDATE dbo.Product SET Color = '' WHERE Color IS NULL");
}

答案 1 :(得分:2)

您还可以通过编辑迁移来设置默认数据库值,如下所示:

public override void Up() 
{
    AlterColumn("dbo.Product ", "Color", c => c.String(nullable: false, defaultValue: ""));

}