Open KevserAkbas opened 3 years ago
Entity Framework Core (EF Core) 2016 yılından itibaren .NET Core platformu için geliştirilen ORM aracıdır.
EF ve EF Core arasındaki farklar
Install-Package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.EntityFrameworkCore.Tools
Bir ORM, çoğu durumda doğrudan herhangi bir SQL ifadesi yazmak zorunda kalmadan bir veritabanındaki verilerle çalışmamıza izin verir
ve temel olarak arka planda veritabanında kalıcı olacak türlerle çalışmamıza izin verir.
Entity Framework'ün önceki sürümlerinde olduğu gibi, EF Core, verilerimizle etkileşimde bulunmak için LINQ ifadeleriyle çalışmamıza izin verir.
EF Core çok hafif bir çerçevedir ve ASP.NET Core MVC web uygulamalarıyla birlikte iyi bir yardımcı olabilir.
Tıpkı .NET Core ve ASP.NET Core gibi, EF Core da platformlar arası (cross-platform) bir şekilde çalışıyor.
Dolayısıyla, yine de veritabanı ile Linux veya diğer platformlarda etkileşime girmenize izin verecektir.
Ayrıca, yine .NET Core gibi, EF Core da açık kaynak kodludur.
Kaynak kodunu GitHub'da bulabilirsiniz.
EF Core, SQL Server ile çalışmayı destekler.
Yani temelde ASP.NET Core uygulamaları için varsayılan diyelim.
Ancak kesinlikle sadece SQL Server kullanmakla sınırlı değiliz.
EF Core, diğer veritabanları ile çalışmamıza olanak tanır.
İlişkisel olmayan veri depoları bile desteklenir.
Entity Framework'ün önceki sürümleriyle karşılaştırıldığında akılda tutulması gereken önemli bir şey, EF Core'un yalnızca bir koda dayalı (code-first-based) yaklaşımını desteklemesidir.
Veritabanı öncelikli yaklaşım (database-first) artık desteklenmiyor.
Ancak bu, modelin veritabanından oluşturulamayacağı anlamına gelmez.
Hala destekleniyor.
Desteklenmeyen şey, EDMX tabanlı yaklaşımdır.
Veritabanındaki verilerle çalışmak için kodumuza SQL ifadeleri yazabilir veya veritabanında bulunan bir saklı yordamı çağırabiliriz.
Veritabanındaki verilerle çalışmak için kodumuza SQL ifadeleri yazabilir veya veritabanında bulunan bir saklı yordamı çağırabiliriz.
Geliştiriciler genellikle sınıflar ve nesnelerle çalışmayı severler.
İşte EF Core burada devreye giriyor.
ORM gerçekten kod ve veritabanı arasında oturur.
Ve kodumuzdaki nesneleri veritabanındaki verilerle eşleştirecektir.
Bu, geliştiriciler olarak, nesneleri veritabanı tarafına değil, kod kısmına odaklanmamızı sağlar.
Örneğin:
Uygulamamızda Pie adında bir tipimiz var.
Ve bazı özellikler var.
EF Core aracılığıyla, bu tür, özelliklerin bir tabloda sütunlar olarak göründüğünü görebileceğimiz veritabanındaki bir tabloyla eşleştirilecektir.
EF Core genellikle bu tabloyu sizin için oluşturmaya özen gösterir.
Pie sınıfının özelliklerine bağlı olarak, oluşturulan sütunlara hangi türleri vermesi gerektiğini bulacaktır.
EF Core, oldukça az sayıda kural da kullanır.
Örneğin, Pie sınıfında, Id veya PieId adlı özellik varsayılan olarak veritabanındaki birincil anahtar olur.
Uygulamamıza EF Core eklemek için yapmamız gereken adımlar
Alan sınıflarımıza ihtiyacımız olacak.
EF Core'un yalnızca önce kodu desteklediğini unutmayın.
Oluşturduğumuz etki alanına bağlı olarak, daha sonra EF Core'dan veritabanını oluşturmasını isteyeceğiz.
İkinci olarak, bir database context class veritabanı bağlam sınıfı (database context class) oluşturmamız gerekecek.
Bu sınıf, Entity Framework Core ile çalışma şeklimizde çok önemli bir rol oynar.
Uygulamamızın kodu ile gerçek veritabanı arasında ara, köprü, diyelim ki gibi görülebilir.
Uygulamanın çalışma süresi boyunca varlık nesnelerini yönetir,
böylece nesneleri veritabanımızdaki verilerle doldurur, değişiklik izlemeyi gerçekleştirir ve verilerin veritabanına geri gönderilmesinden sorumlu olur.
Burada, AppDbContext olarak adlandırılan veritabanı bağlamının kodunun bir bölümünü görebiliriz.
Sınıf, gerekli olan DbContext temel sınıfından miras alır.
Genellikle, açığa çıkardığı veya yönettiği her varlık koleksiyonu için DbSet özelliklerini ortaya çıkarır.
Temel olarak, bir DbSet özelliği eklemek, EF Core'a veritabanında karşılık gelen bir tablo,
bu durumda Pie tablosu olacağına dair bir gösterge olacaktır.
Bu özellik sayesinde verilere ve dolayısıyla bu tablodaki değerlere ulaşabiliriz.
Daha sonra, kodumuzun veritabanına nasıl bağlanabileceğimizi bilmesini sağlayacak bir yola ihtiyacımız olacak ve oldukça mantıksal olarak, bunu yapmak için bir bağlantı dizesi kullanacağız.
.NET'in önceki sürümlerinde, yani .NET olmayan Core'da, genellikle bunu web.config dosyasının içine yerleştiririz.
Bu .NET Core ile değişti.
Bağlantı dizesi artık tipik olarak bir appsettings.json dosyasına yerleştirilecektir.
Ayrıca Startup sınıfında daha fazla yapılandırma değişikliği yapmamız gerekecek.
Burada, bağlantı dizesini içeren appsettings.json dosyasının bir bölümünü görebiliriz ve
ona DefaultConnection adlı bir anahtar verildi.
Bağlantı dizesi eklendiğinde, uygulamamıza EF Core kullanacağımızı bildirmemiz gerekiyor.
Daha önce gördüğümüz gibi, bunu yapmak için bunun için hizmetleri Startup sınıfımızdaki ConfigureServices yöntemindeki hizmetler koleksiyonuna kaydetmemiz gerekiyor.
Burada, AppDbContext'te AddDbContext kullanıldı.
AppDbContext, DbSets içeren kendi oluşturduğumuz DbContext sınıfımızdı.
Daha sonra seçenekler üzerinden SQL Server kullanacağımızı belirtiyoruz ve bir bağlantı dizesi olarak belirtilen DefaultConnection kullanıyoruz.
Son olarak, EF Core'un uygulamamızda çalışmasını sağlamak için bazı paketler getirmemiz gerekecek.
Bunun yalnızca ASP.NET Core 3 ve ASP.NET Core 5'te gerekli olduğunu unutmayalım.
Eski ASP.NET Core 2.1'de, bu adımı atlayabilirsiniz.
EF Core eklendiğinde artık verilerle çalışmamız gerekiyor.
bunun için LINQ kullanacağız.
kod parçacığında, veritabanındaki pastalara erişmek için bağlam sınıfında Pies özelliğini kullandığımı görebilirsiniz.
Bu durumda sadece turta (pie) istemiyorum, pastanın ait olduğu kategoriyi de isteyeceğim.
Burada Include yöntemini kullanarak belirtiliyor.
Son olarak, tüm turtaları geri almak istendiği de belirtildi.
Sadece IsPieOfTheWeek özelliğinin true olarak ayarlandığı kişileri istiyorum.
EF Core, bunu en uygun sorguda çevirecek ve bunu veritabanına gönderecektir.
Ortaya çıkan varlıklara DbContext üzerindeki Pies özelliği aracılığıyla erişilebilir.
Context, verileri sorgulamak için kullanılacak, ancak aynı zamanda veritabanında değişiklik yapmak istediğimizde de kullanılacaktır.
Örneğin, veri eklemek istiyoruz.
Bu noktada, uygulamamız sadece salt okunur pie listesini görselleştirebilir.
Burada ne yapıldığına dikkat edelim.
Bir OrderDetail örneği oluşturuluyor ve ardından bunları bağlamdaki OrderDetails özelliğine ekleniyor.
Sepetteki tüm öğeleri döngüye alma bitirdiğinde, değişiklikler uygulayacak, böylece eklenen varlıkları SaveChanges yöntemi kullanarak yapılacak.
Bu, context tarafından bellekte tutulan varlıkların listesinin veritabanı ile senkronize olmasını sağlayacaktır.
Gerçek veritabanını kendimiz yönetmiyoruz.
Bunun yerine, EF Core bunu bizim için yapıyor,
bu yüzden bunu yapmak için EF Core'un yardımını istememiz gerekecek.
EF Core, bunu desteklemek için migrations adı verilen bir şeyle birlikte gelir.
Bir migration, EF Core tarafından oluşturulacak ve temelde veritabanı modelini etki alanı modeliyle senkronize hale getirmek için yürüteceği koddur.
Başlangıçta, bu migration kuralı, etki alanı varlıklarımızı eşleştirmek için veritabanında sahip olmamız gereken tüm tabloları oluşturmak için kodu oluşturur.
Migration oluşturma, Visual Studio'daki Paket Yöneticisi Konsolu (Package Manager Console) aracılığıyla yapılabilir.
Bu bağlamda hatırlamamız gereken iki komut var.
Add‑migration
, veritabanınızı oluşturduğunuz modelle senkronize hale getirebilecek x kodunu üreten komut olacaktır.
Ancak sadece migration'i oluşturmak fiziksel veritabanınızı henüz güncel hale getirmez.
Yalnızca update‑database
komutunu çalıştırdığınızda, SQL komut dosyası kodu veritabanına karşı çalıştırılır.
Gerçek veritabanını oluşturmanın yanında, veritabanını bazı başlangıç verileriyle doldurmak için EF Core da kullanabiliriz.
Uygulama kodumuzda, örneğin, bazı verilerin zaten mevcut olup olmadığını kontrol edebiliriz ve veri yoksa, o zaman veritabanındaki Pie tablosuna turta ekleyebiliriz.
Ve bunun için HasData yöntemini bir x aracılığıyla verileri tohumlamak (seed) için kullanabiliriz.
HasData yöntemi henüz ASP.NET Core 2.1'de mevcut değildir.
Pie alan sınıfında bir değişiklik yapmamız gerektiğini hayal edelim.
Örneğin, yeni bir özellik eklenmesi gerekiyor.
EF Core veritabanında bir tablo oluşturduğundan, veritabanındaki tabloyu manuel olarak kendimiz gidip güncellememeliyiz.
Ancak yine de veritabanını güncellememiz gerekecek.
Yine, bu bir migration kullanılarak çözülebilir.
Yeni eşlemeyi içerecek kodu tekrar üretmek için add-migration
komutunu tekrar çalıştırabiliriz.
Ve sonra update-database
'i tekrar çalıştırdığımızda, veritabanı senkronize olacak.
Entity Framework
ORM
ORM veya Object to Relational Mapping temel olarak veritabanında yer alan tablo ve alanları nesne olarak kullanmamıza imkan veren bir yazılım mimarisidir.
Neden kullanılır?
Entity Framework kurulumu
Install-Package EntityFramework
Model oluşturma