在迁移期间使用 Sql()
例如:你要将现有列从非必需列表迁移到必需列。在这种情况下,你可能需要在迁移中为已更改字段实际为 NULL
的行填充一些默认值。如果默认值很简单(例如 0
),你可以在列定义中使用 default
或 defaultSql
属性。如果不是那么容易,你可以在迁移的 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
调用成功,表格如下所示(示例数据显示):
其他用法
你可以将 Sql()
函数用于数据库中所有类型的 DML 和 DDL 活动。它作为迁移事务的一部分执行; 如果 SQL 失败,则完整迁移将失败并完成回滚。