.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…
Teşekkürler. Kurtardınız beni
Faydalandıysanız ne mutlu.
Kolay gelsin.
Harika bir adamsın sen
Keşke söyleseydin 🙂
Teşekkür ederim.
Ya Hocam sen var ya supersin .. Seni bu alemde Tek gecerim inan ki
🙂 Teşekkürler. Faydalandıysanız ne mutlu…
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.
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.
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…
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
burada da connection string tanımlamazsam
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.
Hocam Tekrar Merhaba. Hatayı şu şekilde düzelttim. Belki Faydası dokunur diye paylaşıyorum.
Startup içinden DI yaparken
Sizin başka bir öneriniz varmı hocam?
Merhaba Kenan,
Dönüş için teşekkürler.
Doğru yöntemi uygulamışsın 🙂 Eline sağlık.
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 🙂
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.. 🙁