Aracılığıyla paylaş


Geçiş geçmişi tablosunu özelleştirme

Dekont

Yalnızca EF6'ya Doğru - Bu sayfada ele alınan özellikler, API'ler vb. Entity Framework 6'da sunulmuştur. Önceki bir sürümü kullanıyorsanız, bilgilerin bir kısmı veya tümü geçerli değildir.

Dekont

Bu makalede, temel senaryolarda Code First Migrations'ın nasıl kullanılacağını bildiğiniz varsayılır. Aksi takdirde devam etmeden önce Code First Migrations'ı okumanız gerekir.

Geçiş Geçmişi Tablosu nedir?

Geçiş geçmişi tablosu, Code First Migrations tarafından veritabanına uygulanan geçişlerle ilgili ayrıntıları depolamak için kullanılan bir tablodur. Varsayılan olarak, veritabanındaki tablonun adı __MigrationHistory ve veritabanına ilk geçiş uygulanırken oluşturulur. Entity Framework 5'te, uygulama Microsoft Sql Server veritabanı kullandıysa bu tablo bir sistem tablosuydu. Ancak Bu, Entity Framework 6'da değişmiştir ve geçiş geçmişi tablosu artık bir sistem tablosu olarak işaretlenmemektedir.

Geçiş Geçmişi Tablosu neden özelleştirilir?

Geçiş geçmişi tablosunun yalnızca Code First Migrations tarafından kullanılması gerekir ve el ile değiştirilmesi geçişleri bozabilir. Ancak bazen varsayılan yapılandırma uygun değildir ve tablonun özelleştirilmesi gerekir, örneğin:

  • 3rd tarafı Geçişler sağlayıcısını etkinleştirmek için sütunların adlarını ve/veya modellerini değiştirmeniz gerekir
  • Tablonun adını değiştirmek istiyorsunuz
  • __MigrationHistory tablosu için varsayılan olmayan bir şema kullanmanız gerekir
  • Bağlamın belirli bir sürümü için ek veri depolamanız ve bu nedenle tabloya ek bir sütun eklemeniz gerekir

Önlem sözcükleri

Geçiş geçmişi tablosunu değiştirmek güçlüdür, ancak aşırıya kaçmamaya dikkat etmeniz gerekir. EF çalışma zamanı şu anda özelleştirilmiş geçiş geçmişi tablosunun çalışma zamanıyla uyumlu olup olmadığını denetlememektedir. Bu değilse, uygulamanız çalışma zamanında bozulabilir veya öngörülemeyen şekillerde davranabilir. Bu, veritabanı başına birden çok bağlam kullanıyorsanız daha da önemlidir. Bu durumda, birden çok bağlam, geçişlerle ilgili bilgileri depolamak için aynı geçiş geçmişi tablosunu kullanabilir.

Geçiş Geçmişi Tablosu nasıl özelleştirilir?

Başlamadan önce, yalnızca ilk geçişi uygulamadan önce geçiş geçmişi tablosunu özelleştirebileceğinizi bilmeniz gerekir. Şimdi koda.

İlk olarak System.Data.Entity.Migrations.History.HistoryContext sınıfından türetilmiş bir sınıf oluşturmanız gerekir. HistoryContext sınıfı DbContext sınıfından türetilir, bu nedenle geçiş geçmişi tablosunun yapılandırılması, EF modellerini akıcı API ile yapılandırmaya çok benzer. Yalnızca OnModelCreating yöntemini geçersiz kılmanız ve tabloyu yapılandırmak için akıcı API kullanmanız yeterlidir.

Dekont

GENELLIKLE EF modellerini yapılandırırken base çağrısı yapmanız gerekmez. DbContext.OnModelCreating() gövdesi boş olduğundan geçersiz kılınan OnModelCreating() yönteminden OnModelCreating(). Geçiş geçmişi tablosu yapılandırılırken bu durum geçerli değildir. Bu durumda, OnModelCreating() geçersiz kılma işleminizde yapmanız gereken ilk şey aslında base çağrısı yapmaktır. OnModelCreating(). Bu, geçiş geçmişi tablosunu, geçersiz kılma yönteminde ayar yaptığınız varsayılan şekilde yapılandırır.

Geçiş geçmişi tablosunu yeniden adlandırmak ve "admin" adlı özel bir şemaya koymak istediğinizi varsayalım. Ayrıca DBA'nız MigrationId sütununu Migration_ID olarak yeniden adlandırmanızı istiyor.  Bunu elde etmek için HistoryContext'ten türetilen aşağıdaki sınıfı oluşturabilirsiniz:

    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");
            }
        }
    }

Özel HistoryContext'iniz hazır olduktan sonra ef'i kod tabanlı yapılandırma aracılığıyla kaydederek bunu fark etmeniz gerekir:

    using System.Data.Entity;

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

Hepsi bu kadar. Artık Paket Yöneticisi Konsoluna, Geçişleri Etkinleştir'e, Geçiş Ekle'ye ve son olarak Dala-Veritabanı'na gidebilirsiniz. Bu, veritabanına HistoryContext türetilmiş sınıfınızda belirttiğiniz ayrıntılara göre yapılandırılmış bir geçiş geçmişi tablosu eklenmesiyle sonuçlanmalıdır.

Migrations History Table