Yazılım Mimarileri ve Tasarım Desenleri Üzerine

.NET Core – Class Library’de Migration İşlemleri

Merhaba,

.NET Core çekirdeğinde geliştirilen bir projede veritabanı işlemlerinizi Class Library olarak ayrı bir katmanda gerçekleştirmek istiyor olabilirsiniz. Lakin bu isteğinize istinaden gerekli işlemleri yaptıktan sonra migration oluştururken “Unable to create an object of type ‘Context’. For the different patterns supported at design time, see…” hatasıyla karşılaşıyor olabilirsiniz. Eğer ki, bahsedilen hatayı aldıysanız ve hala bir çözüm arayışındaysanız doğru adrestesiniz. Şimdi gelin bu hataya takılmaksızın Class Library’de veritabanı işlemlerini nasıl yapacağımızı inceleyelim.

İçeriğimizde küçük bir senaryo üzerinden gideceğimizden dolayı ilk olarak veritabanı işlemlerini yapacağımız Class Library’de gerekli olan “Context” ve “Entity” yapılarını oluşturalım.

    public class VTContext : DbContext
    {
        public VTContext(DbContextOptions<VTContext> options) : base(options)
        {
        }
        public DbSet<Employee> Employees { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=.;Database=NewDatabase;Trusted_Connection=True;");
        }
    }
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

Gerekli “Context” ve “Entity” yapıları oluşturulduktan sonra sıra migrationları oluşturmaya geldi. Bunun için Class Library projesinin dizininde aşağıdaki ekran görüntüsünde olduğu gibi migration talimatlarını vermemiz yeterli…

İşte… Görüldüğü üzere içeriğimizin ilk paragrafında değindiğimiz ilgili hatayla karşılaşmış bulunmaktayız.

Bu hata, oluşturduğumuz “VTContext” isimli kaynak adında bir nesneyi oluşturacak tasarımın olmamasından kaynaklanmaktadır. Bunun için bizim bir strateji belirlememiz gerekecektir. O da şöyledir;

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<VTContext>
    {
        public VTContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<VTContext>();
            var connectionString = "Server=.;Database=NewDatabase;Trusted_Connection=True;";
            builder.UseSqlServer(connectionString);
            return new VTContext(builder.Options);
        }
    }

Bu sınıfı context ile aynı dizinde oluşturmamız yeterlidir. Tek yapılması gereken bulunduğu projeyi bir seferliğine Build etmektir. İlgili sınıfı incelersek eğer; “IDesignTimeDbContextFactory” interface’i sayesinde “CreateDbContext” isimli bir metodu implement etmekte ve içerik olarak Factory Method Design Pattern‘i kullanarak bizlere belirtilen tipte context nesnesi üretmektedir.

Dolayısıyla bu durumda tekrar migration talimatını verirsek;

ekran görüntüsünden anlaşılacağı üzere migration sorunsuz bir şekilde başarıyla oluşturulacaktır. Hatta oluşturulan tüm migrasyonlar veritabanına yansıtılarak veritabanı oluşturulmuş ve tablolar basılmıştır.

Gördüğünüz üzere .NET Core projelerinde veritabanı işlemlerinizi bu şekilde Class Library’e alabilir ve micro service tadında çalışmalarınıza devam edebilirsiniz.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Exit mobile version