我想将[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.
有没有办法在不删除数据库的情况下克服这个问题?例如,能够为所有冲突记录设置新的默认值会在我的场景中运行良好,但我还没有找到任何实际的方式。
答案 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: ""));
}