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

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

  6. Kenan dedi ki:

    Merhaba Değerli hocam. Startup İçinden, DI ile DAL katmanında Context sınıfına tek bir yerden yönetilebilirlik için Connection stringi göndermeye çalıştığımızda aynı şekilde migration hatası alıyorum.

    startup içinde

        services.AddDbContext(builder =>
                 builder.UseSqlServer(connection.ConnectionString)
    // connection stringi burdan göndermek istiyorum.
    

    burada da connection string tanımlamazsam

      public Context(DbContextOptions options)
            : base(options)
            {
    
            }
     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
            {
                optionsBuilder
              .UseSqlServer(@"data source =  ")
     
            }
    

    migration işlemi yapmıyor. Konu başlığındaki hatayı alıyorum. Startup içinden Environment değişkenlerden güvenlik açısından almak ve göndermek istiyorum SQL bağlantısını. İlgilerinize şimdiden teşekkür ederim.

  7. Kenan dedi ki:

    Hocam Tekrar Merhaba. Hatayı şu şekilde düzelttim. Belki Faydası dokunur diye paylaşıyorum.
    Startup içinden DI yaparken

     services.AddDbContext(builder =>
                 builder.UseSqlServer(connection.ConnectionString, x => x.MigrationsAssembly("DataAccess"))
    //MigrationAssembly kısmını ekledim. ve sorun kalmadı.
    

    Sizin başka bir öneriniz varmı hocam?

  8. Yunus Emre Haşlak dedi ki:

    Projemde migration oluşturamıyordum neredeyse kafayı yemek üzereydim ki bu makalenize denk geldim. Sağolun değerli bilgileriniz için, elinize sağlık 🙂

  9. hasan dedi ki:

    harikasın abi. bu sorunu çözdüm. fakat şimdi de N-tier yapacaz diye Modellerim çalışmıyor. Boş kayıt atıyor asp-for çalışmıyor.. 🙁

Yunus Emre Haşlak için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir