自動Code First 移轉

自動移轉可讓您使用 Code First 移轉,而不需針對您所做的每項變更,在您的專案中有程式代碼檔案。 並非所有變更都可以自動套用 - 例如,數據行重新命名需要使用程式代碼型移轉。

注意

本文假設您知道如何在基本案例中使用 Code First 移轉。 如果您不這麼做,則必須先閱讀 Code First 移轉 再繼續。

小組環境的建議

您可以在小組開發案例中插上自動和程式代碼型移轉,但不建議這麼做。 如果您是使用原始檔控制的開發人員小組的一部分,則應該使用純自動移轉或純程式代碼型移轉。 鑒於自動移轉的限制,我們建議在小組環境中使用程式代碼型移轉。

建置初始模型與資料庫

在開始使用移轉之前,我們需要一個專案和一個 Code First 模型。 此逐步解說中我們將使用標準 BlogPost 模型。

  • 建立新的 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 資料庫。

    Database LocalDB

啟用移轉

現在可以對我們的模型做更多變更。

  • 請將一個 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 類別,以構成 BlogPost 之間關係的另一端
    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命令。

摘要

在本逐步解說中,您已瞭解如何使用自動移轉將模型變更推送至資料庫。 您也瞭解如何在需要更多控制權時,在自動移轉之間建構和執行程式代碼型移轉。