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