Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
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 bazıları veya tümü geçerli değildir.
Uyarı
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ş sağlayıcısını etkinleştirmek için sütunların adlarını ve/veya özelliklerini 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 geçelim.
İ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.
Uyarı
GENELLIKLE EF modellerini yapılandırırken, DbContext.OnModelCreating() gövdesi boş olduğundan geçersiz kılınan OnModelCreating() yönteminden base.OnModelCreating() çağrısı yapmanız gerekmez. 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.OnModelCreating() çağrısını yapmaktır. 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'in bunu tanıyabilmesi için kod tabanlı yapılandırma aracılığıyla kaydetmeniz gerekir.
using System.Data.Entity;
namespace CustomizableMigrationsHistoryTableSample
{
public class ModelConfiguration : DbConfiguration
{
public ModelConfiguration()
{
this.SetHistoryContext("System.Data.SqlClient",
(connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
}
}
}
Neredeyse bu kadar. Artık Paket Yöneticisi Konsolu'na giderek Migrations'i Etkinleştir, Add-Migration ve son olarak Veritabanını Güncelle'yi çalıştırabilirsiniz. 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.