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

Tor*_*ene 0 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; }
}
Run Code Online (Sandbox Code Playgroud)

然后我运行命令

add-migration MakeColorRequired // Runs successfully
update-database                 // Crashes
Run Code Online (Sandbox Code Playgroud)

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

Cannot insert the value NULL into column 'Color', 
       table 'MySystem.dbo.Product'; 
       column does not allow nulls. 
       UPDATE fails.
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

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