在迁移期间使用 Sql()

例如:你要将现有列从非必需列表迁移到必需列。在这种情况下,你可能需要在迁移中为已更改字段实际为 NULL 的行填充一些默认值。如果默认值很简单(例如 0),你可以在列定义中使用 defaultdefaultSql 属性。如果不是那么容易,你可以在迁移的 Up()Down() 成员函数中使用 Sql() 函数。

这是一个例子。假设一个类作者包含一个电子邮件地址作为数据集的一部分。现在我们决定将电子邮件地址作为必填字段。要迁移现有列,企业可以明智地创建虚拟电子邮件地址,例如 fullname@example.com,其中全名是作者的全名,没有空格。将 [Required] 属性添加到字段 Email 将创建以下迁移:

public partial class AuthorsEmailRequired : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(nullable: false, maxLength: 512));
    }
    
    public override void Down()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(maxLength: 512));
    }
}

如果数据库中有一些 NULL 字段,则会失败:

无法将值 NULL 插入电子邮件列,表’App.Model.DatabaseContext.dbo.Authors’; 列不允许空值。更新失败。

AlterColumn 命令之前添加以下内容将有助于:

Sql(@"Update dbo.Authors
    set Email = REPLACE(name, ' ', '') + N'@example.com'
    where Email is null");

update-database 调用成功,表格如下所示(示例数据显示):

StackOverflow 文档

其他用法

你可以将 Sql() 函数用于数据库中所有类型的 DML 和 DDL 活动。它作为迁移事务的一部分执行; 如果 SQL 失败,则完整迁移将失败并完成回滚。