在遷移期間使用 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 失敗,則完整遷移將失敗並完成回滾。