Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.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…

.NET Core - Class Library'de Migration İşlemleri

İş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;
.NET Core - Class Library'de Migration İşlemleri
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.
.NET Core - Class Library'de Migration İşlemleri

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…

Bunlar da hoşunuza gidebilir...

9 Cevaplar

  1. Mustafa dedi ki:

    Teşekkürler. Kurtardınız beni

  2. Söylemem dedi ki:

    Harika bir adamsın sen

  3. Metin dedi ki:

    Ya Hocam sen var ya supersin .. Seni bu alemde Tek gecerim inan ki

  4. Şahin dedi ki:

    Hocam, açıklamalarınız için çok teşekkür ederim. MVC Core ile yeni uğraşmaya başladım. Sizin siteniz kadar açıklayıcı anlatan başka site bulamadım. Yeni makalelerinizi heyecanla bekliyorum.

  5. mücteba dedi ki:

    hocam elinize sağlık. çok kaynak baktım yine sonucu sizin blog’da buldum.
    Ama yinede sorum olacak:);
    yukarıda OnConfiguring metodunda UseSqlServer(“database=….”) bu şekilde connectionstring i belirttiğimizde katmanlı mimaride migration da “unable” hatası vermiyor. Ama context classımız;

    public ModelContext(DbContextOptions options) : base(options){ }
    bu şekilde olunca “unable…”hatasını veriyor.

    • Gençay dedi ki:

      Merhaba,

      Teşekkürler. Sorunuza gelirsek eğer inanın ki inşa ettiğiniz yapıyı bütünsel olarak incelemeden cevap vermem neredeyse mümkün değil.

      Kolay gelsin…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir