共用方式為


自訂移轉歷程記錄資料表

注意

僅限 EF6 及更新版本 - Entity Framework 6 已引進此頁面中所討論的功能及 API 等等。 如果您使用的是較早版本,則不適用部分或全部的資訊。

注意

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

什麼是移轉歷程記錄資料表?

移轉歷程記錄資料表是Code First 移轉用來儲存套用至資料庫之移轉詳細資料的資料表。 根據預設,資料庫中的資料表名稱會__MigrationHistory,並在將第一個移轉套用至資料庫時建立。 在 Entity Framework 5 中,如果應用程式使用 Microsoft Sql Server 資料庫,則此資料表是系統資料表。 不過,這已在 Entity Framework 6 中變更,而且移轉歷程記錄資料表已不再標示系統資料表。

為何要自訂移轉歷程記錄資料表?

移轉歷程記錄資料表應該只供Code First 移轉使用,並手動加以變更可能會中斷移轉。 不過,有時候預設組態不適合,而且需要自訂資料表,例如:

  • 您必須變更資料行的名稱和/或 Facet,才能啟用 3 個 rd 方移轉提供者
  • 您想要變更資料表的名稱
  • 您必須針對__MigrationHistory資料表使用非預設架構
  • 您需要儲存特定版本內容的其他資料,因此您必須將其他資料行新增至資料表

預防措施單字

變更移轉歷程記錄資料表功能強大,但您必須小心不要過度執行。 EF 執行時間目前不會檢查自訂移轉歷程記錄資料表是否與執行時間相容。 如果不是您的應用程式,可能會在執行時間中斷,或以無法預期的方式運作。 如果您針對每個資料庫使用多個內容,在此情況下,多個內容可以使用相同的移轉歷程記錄資料表來儲存移轉的相關資訊,這會更加重要。

如何自訂移轉歷程記錄資料表?

開始之前,您必須知道您只能在套用第一次移轉之前自訂移轉歷程記錄資料表。 現在,到程式碼。

首先,您必須建立衍生自 System.Data.Entity.Migrations.History.HistoryCoNtext 類別的類別。 HistoryCoNtext 類別衍生自 DbCoNtext 類別,因此設定移轉歷程記錄資料表與使用 Fluent API 設定 EF 模型非常類似。 您只需要覆寫 OnModelCreating 方法,並使用 Fluent API 來設定資料表。

注意

一般而言,當您設定 EF 模型時,不需要呼叫基底。自 DbCoNtext.OnModelCreating() 自 DbCoNtext.OnModelCreating() 以來覆寫的 OnModelCreating 方法中的 OnModelCreating() 有空的主體。 設定移轉歷程記錄資料表時,情況並非如此。 在此情況下,在 OnModelCreating() 覆寫中要做的第一件事就是實際呼叫基底。OnModelCreating()。 這會以您在覆寫方法中調整的預設方式設定移轉歷程記錄資料表。

假設您想要重新命名移轉歷程記錄資料表,並將其放入名為 「admin」 的自訂架構。 此外,DBA 也希望您將 MigrationId 資料行重新命名為 Migration_ID。  您可以藉由建立衍生自 HistoryCoNtext 的下列類別來達成此目的:

    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Migrations.History;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class MyHistoryContext : HistoryContext
        {
            public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
                : base(dbConnection, defaultSchema)
            {
            }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<HistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");
                modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
            }
        }
    }

一旦您的自訂 HistoryCoNtext 準備就緒,您必須透過 程式碼型組態 註冊 EF 來察覺它:

    using System.Data.Entity;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class ModelConfiguration : DbConfiguration
        {
            public ModelConfiguration()
            {
                this.SetHistoryContext("System.Data.SqlClient",
                    (connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
            }
        }
    }

差不多就是這樣。 現在,您可以移至 封裝管理員 主控台、啟用移轉、新增移轉,最後移至 Update-Database。 這應該會根據您在 HistoryCoNtext 衍生類別中指定的詳細資料,將移轉歷程記錄資料表新增至資料庫。

Migrations History Table