【问题标题】:Setting default values for existing DB records when updating schema with the Code First Migrations使用 Code First 迁移更新架构时为现有数据库记录设置默认值
【发布时间】:2026-02-09 02:50:01
【问题描述】:

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

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 成为必填字段,并给出错误:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 正是我想要的。谢谢!
    【解决方案2】:

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

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

    【讨论】: