自動Code First 移轉
自動移轉可讓您使用 Code First 移轉,而不需針對您所做的每項變更,在您的專案中有程式代碼檔案。 並非所有變更都可以自動套用 - 例如,數據行重新命名需要使用程式代碼型移轉。
注意
本文假設您知道如何在基本案例中使用 Code First 移轉。 如果您未這麼做,則必須先閱讀 Code First 移轉 再繼續。
小組環境的建議
您可以在小組開發案例中插上自動和程式代碼型移轉,但不建議這麼做。 如果您是使用原始檔控制的開發人員小組的一部分,則應該使用純自動移轉或純程式代碼型移轉。 鑒於自動移轉的限制,我們建議在小組環境中使用程式代碼型移轉。
建置初始模型與資料庫
在開始使用移轉之前,我們需要一個專案和一個 Code First 模型。 此逐步解說中我們將使用標準 Blog 和 Post 模型。
- 建立新的 MigrationsAutomaticDemo 控制台應用程式
- 將最新版本的 EntityFramework NuGet 套件新增至專案
- [工具] –> [程式庫套件管理員] –> [套件管理員主控台]
- 執行 Install-package EntityFramework 命令
- 使用如下所示的程式碼新增 Model.cs 檔案。 此程式碼會定義構成我們網域模型的單一 Blog 類別,以及作為 EF Code First 內容的 BlogContext 類別
using System.Data.Entity;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.Infrastructure;
namespace MigrationsAutomaticDemo
{
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
}
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
}
}
- 現在我們有了一個模型,即可用來執行資料存取。 使用如下所示的程式碼更新 Program.cs 檔案。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MigrationsAutomaticDemo
{
class Program
{
static void Main(string[] args)
{
using (var db = new BlogContext())
{
db.Blogs.Add(new Blog { Name = "Another Blog " });
db.SaveChanges();
foreach (var blog in db.Blogs)
{
Console.WriteLine(blog.Name);
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
執行您的應用程式,您會看到 已為您建立 MigrationsAutomaticCodeDemo.BlogContext 資料庫。
啟用移轉
現在可以對我們的模型做更多變更。
- 請將一個 URL 屬性引進 Blog 類別。
public string Url { get; set; }
如果您要再次執行應用程式,您會收到 InvalidOperationException,指出建立資料庫之後,支援 'BlogContext' 內容的模型已變更。請考慮使用 Code First 移轉 來更新資料庫 (http://go.microsoft.com/fwlink/?LinkId=238269)。
如例外狀況所示,現在可以開始使用 Code First 移轉。 因為我們想要使用自動移轉,因此我們要指定 –EnableAutomaticMigrations 參數。
在 封裝管理員 控制台中執行 Enable-Migrations –EnableAutomaticMigrations 命令。此命令已將 Migrations 資料夾新增至我們的專案。 這個新資料夾包含檔案:
組態類別。 這個類別可讓您設定移轉對內容的運作方式。 在此逐步解說中,我們將只使用預設組態。 「由於專案中只有一個單一 Code First 內容,因此 Enable-Migrations 已自動填入此組態適用的內容類型。」
您的第一個自動移轉
Code First 移轉有兩個您將先熟悉的主要命令。
- Add-Migration 將根據自上次建立移轉以來您對模型所做的變更,來建立下一次移轉
- Update-Database 會將任何擱置的移轉套用至資料庫
我們將避免使用 Add-Migration(除非我們真的需要),並專注於讓 Code First 移轉 自動計算和套用變更。 讓我們使用Update-Database取得 Code First 移轉,將變更推送至我們的模型 (新的 Blog.Url 屬性) 至資料庫。
- 在 封裝管理員 控制台中執行Update-Database命令。
MigrationsAutomaticDemo.BlogContext 資料庫現在會更新為在 Blogs 數據表中包含 Url 數據行。
您的第二個自動移轉
讓我們進行另一個變更,並讓我們 Code First 移轉 自動將變更推送至資料庫。
- 同時也新增新的 Post 類別
public class Post
{
public int PostId { get; set; }
[MaxLength(200)]
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
- 我們也會將 Post 集合新增至 Blog 類別,以構成 Blog 和 Post 之間關係的另一端
public virtual List<Post> Posts { get; set; }
現在,使用 Update-Database 讓資料庫更新為最新狀態。 這次讓我們指定 –Verbose 旗標,讓您可以看到 Code First 移轉正在執行的 SQL。
- 在套件管理員主控台中執行 -Verbose 命令。
新增程式代碼型移轉
現在讓我們看看一些可能想要針對 使用程式代碼型移轉的專案。
- 讓我們將 Rating 屬性新增至 Blog 類別
public int Rating { get; set; }
我們只能執行 Update-Database ,將這些變更推送至資料庫。 不過,我們會新增不可為 Null 的 Blogs.Rating 數據行,如果數據表中有任何現有數據,則會為新數據行的數據類型指派 CLR 預設值(Rating 為整數,因此會 是 0)。 但我們應指定預設值為 3,以便 Blog 資料表中的現有資料列以適當的評等開頭。 讓我們使用 Add-Migration 命令將此變更寫出至程式代碼型移轉,以便我們可以編輯它。 Add-Migration 命令可讓我們將這些移轉命名為 ,讓我們直接呼叫 AddBlogRating。
- 在 封裝管理員 控制台中執行 Add-Migration AddBlogRating 命令。
- 在 [ 移轉] 資料夾中,我們現在有新的 AddBlogRating 移轉 。 移轉檔案名稱的前綴包含時間戳記,有助排序。 讓我們編輯產生的程式代碼,以指定 Blog.Rating 的預設值 3 (下列程式代碼中的第 10 行)
移轉也有擷取某些元數據的程式代碼後置檔案。 此元數據可讓 Code First 移轉 在此程式代碼型移轉之前復寫我們執行的自動移轉。 如果另一位開發人員想要執行我們的移轉,或是時候部署應用程式,這很重要。
namespace MigrationsAutomaticDemo.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddBlogRating : DbMigration
{
public override void Up()
{
AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3));
}
public override void Down()
{
DropColumn("Blogs", "Rating");
}
}
}
已編輯的移轉看起來一切良好,現在請使用 Update-Database 將資料庫保持最新狀態。
- 在 封裝管理員 控制台中執行Update-Database命令。
回到自動移轉
我們現在可以自由切換回自動移轉,以進行更簡單的變更。 Code First 移轉 會根據儲存在每個程式代碼型移轉的程式代碼後置檔案中的元數據,以正確的順序執行自動和程式代碼型移轉。
- 讓我們將Post.Abstract屬性新增至模型
public string Abstract { get; set; }
現在,我們可以使用 Update-Database 來取得 Code First 移轉,以使用自動移轉將此變更推送至資料庫。
- 在 封裝管理員 控制台中執行Update-Database命令。
摘要
在本逐步解說中,您已瞭解如何使用自動移轉將模型變更推送至資料庫。 您也瞭解如何在需要更多控制權時,在自動移轉之間建構和執行程式代碼型移轉。