Entity Framework Core - InMemory Veri Tabanı İle Çalışmak

Entity Framework Core'de eğer geliştirme aşamasında veri tabanınız yoksa ya da veri tabanında çalışmayıp test amaçlı çalışacaksak InMemory yapısını düşünebiliriz. Bu teknikte veriler, veri tabanında tutulmak yerine bellekte tutulur.

Konuyu örneklendirebilmek adına .NET 6 Web API projesi oluşturuyoruz. Önümüzdeki iki görselde proje oluşturma adımları mevcuttur. Framework için .NET 6 seçtiğimizden emin olmalıyız.



Projemiz oluştuktan sonra yeni bir API controller oluşturuyoruz. Önümüzdeki iki görselde ProductsController isminde bir controller oluşturuluyor.



Web API projemiz oluşturuldu. EntityFrameworkCore'de InMemory özelliğini kullanabilmek için Nuget Package Manager'den Microsoft.EntityFrameworkCore.InMemory paketini buluyoruz. 


Sonraki çıkan adımlarda OK butonuna tıklayarak Microsoft.EntityFrameworkCore paketlerini de geçişli paket (transitive packages alanında görünür) olarak yüklenmiş olacaktır.



Paketin yüklenmesi tamamlandıktan sonra projemize Product ve Category sınıfları ekliyoruz. Bu sınıflar, Models klasörü altındadır. InMemory olarak oluşturduğumuz veri tabanında DbContext sınıfımızda DbSet türünde tanımlanacaktır.

Product ve Category sınıfları
Product ve Category sınıfları

OnModelCreating metodunda kullanılmak üzere ModelBuilderExtensions sınıfı oluşturuldu. Bu sınıftaki Seed metodu, InMemory veri tabanımızdaki Category ve Product tablosuna eklenecek verileri içerir.  OnModelCreating metodundan Seed metodu çağrıldığında InMemory veri tabanına kayıt olarak ekler. Kullandığım veriler, Northwind veri tabanındaki Products ve Categories tablolarından size tanıdık gelebilir.

ECommerceDbContext adını verdiğimiz DbContext sınıfı, Microsoft.EntityFrameworkCore paketindeki DbContext sınıfından miras alır. 
override olarak kullandığımız OnModelCreating metodunda önce Product ve Category arasındaki ilişkiyi tanımladık. Oluşturulan ilişki, bir kategorinin birden çok ürünü olabilirken; bir ürünün yalnızca bir kategorisi olabilir. Sonra Seed metodunu çağırarak veri tabanına kayıt eklenmesi sağlandı.

Tablolarımızın ismi, isimlendirme kurallarına bağlı kalınarak Products ve Categories olarak verildi.

ProductsController ile temel CRUD testlerimizi yapabiliriz. Metotlar aşağıdaki gibi oluşturuldu. 

Dikkatinizi çekeceğim metot olan EnsureCreated, eğer veri tabanı bellekte yoksa, oluşturma işlemini yapar, varsa tekrar oluşturmaz. Kontrol mekanizması olarak düşünülebilir.

Program.cs'de DbContext ayarını yapmamız gerekir. Kullanılacak metot, AddDbContext olup, bağımılılık, ECommerceDbContext olarak verildi. options tanımlamasında UseInMemoryDatabase metodunu veri tabanı ismi vererek tanımlarız.

Projedeki bütün dosyalar oluştuğunda temel katmanlar aşağıdaki görseldedir.

Projemizi ayağa kaldırdığımızda, swagger yapısı ile aşağıdaki gibi görüntü olacaktır. Bütün testler buradan yapılır. 


/api/Products/1 endpointiyle gönderdiğimiz id'ye ait kaydı bellekteki veri tabanından getirebildik.


Örnek projeye Github repo linkinden ulaşabilirsiniz. 

Bu yazımda Entity Framework Core'de bulunan InMemory özelliğine .NET 6 Web API projesi ile örnekleyerek değindim.

Keyifli ve faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum...

Yorumlar