Code First, Microsoft tarafından yayınlanan Entity Framework’ün üç temel mimarilerinden en popüler olanı ve biz yazılımcılar tarafından en çok tercih edilenidir. Tercih edilmesinin temel sebebi ise Code First isminden de anlaşılacağı üzere kod önceliği olmasından dolayıdır. Bu öncelik biz yazılımcılara hareket esnekliği sağlamaktadır.
Entity Framework Code First mimarisi, projemiz içerisinde c# ile kod yazarak nesnel bir teknik ile veri tabanı (database) geliştirmemize olanak sağlayan bir yapıdır.
Entity Framework ve Code First Kullanımı ile ilgili detaylı bilgilere aşağıda ki makalemden erişebilirsiniz. Biz bu makalemizde Code First kullanımını örneklendirmelerle açıklamaya devam edeceğiz.
Code First Proje Oluşturma
Entity Framework Code First ile çalışmak için öncelikli olarak Entity Freamwork ünü projemize dahil etmemiz gerekmektedir. Bunun için aşağıda ki sıralamada ki işlemleri yapmamız gerekiyor.
Projemize sağ tıklayıp, Manage NuGet Packages linkine tıklıyoruz.
Açılan pencerenin browser sekmesinde ki araç çubuğunu eklemek istediğimiz paketin adını yazıyoruz yani “EntityFramework” anahtar kelimesini yazıyoruz ve entity paketinin yüklenmesi için gerekli kurulum işlemini gerçekleştiriyoruz.
Kurulum işlemi gerçekleştikten sonra projemize Entity Framework dahil olduğunu göreceksiniz.
Artık projemiz kod yazarak veri tabanı geliştirmeye hazır. Entity Framework Code First’de en önemli birincil kural oluşturacağınız databasin her bir tablosuna karşılık gelen bir class olmalıdır. Diğer bir deyişle sql üzerinde oluşturduğumuz tabloları Code Firste oluşturacağımız sınıflar temsil eder. Tabloların içerisinde ki sütunları ise sınıflarımız içerisinde oluşturacağımız propertyler temsil etmektedir. Ayrıca sütunlarımıza DataAnnotations nesnesini kullanarak özelliklerde atayabiliriz.
Şu şekilde özetleyebiliriz:
- Table (MsSQL) = Class (C#)
- Column (MsSQL) = Property (C#)
Şimdi, bir ürün adında bir tablo ve içerisinde ürün id, adı, fiyat ve stok bilgilerini taşıyan bir tablo örneklemesini Code First mimarisi ile yapalım. Bunun için öncelikli olarak projemize Product adında bir sınıf oluşturuyoruz ve sınıf içerisine aşağıda ki kod bloğunda propertyleri kullanarak tablomuzun kolanlarını tanımlıyoruz.
public class Product //Tablo Ismi
{
[Key] //Özellik Atama (Id sutunun anahtar olduğunu belirttik)
public int ID { get; set; } //Sütun ismi
public string Name { get; set; }
public decimal UnitPrice { get; set; }
public int StockAmount { get; set; }
}
Bu kod satırında dikkat etmemiz gereken tek konu class mızı public tanımlamamızdır. Bu kod satırı ile artık Product tablomuz ve sütunlarımız hazır.
Data Annotation nesnesinin detayları için aşağıda linki ziyaret edebilirsiniz.
https://docs.microsoft.com/tr-tr/dotnet/api/system.componentmodel.dataannotations?view=net-6.0
Şimdi ise EntityFreamwork’ün DbContext sınıfından türütelmiş bir context sınıfı oluşturacağız. Context sınıfı DbContext sınıfından kalıtım alınarak veritabanı işlemlerini yapan sınıftır. Projemizde birden fazla context sınıfı oluşturabilirsiniz ama genellikle bir tane oluşturulması tercih edilir ve isim olarak “DatabaseIsmıContext” şekline bir yapı tercih edilir. Bizde “ETradeContext” adında bir class oluşturuyoruz.
public class ETradeContext: DbContext
{
}
Şimdi ise DbSet generic yapısını kullanarak product tablomuzu temsil eden sınıfımızı, entity freamwork ümüze set ediyoruz ve onu artık products ismiyle kullanacağımızı bildiriyoruz.
public class ETradeContext: DbContext
{
public DbSet<Product> Products { get; set; }
}
Bu aşamadan sonra artık projemiz çalıştığında tablomuz işlem yapmaya hazır olacaktır. Yalnız Code First ile projemizde çalışmak için veri tabanı bağlantımızı da belirtmemiz gerekmektedir. Bu nedenle projemizin app dosyasına gidip projemiz çalıştığında hangi veri tabanına bağlanacağını bildirmemiz gerekmektedir.
Bunun için app dosyamızın içinde <configsection> sekmesinin altına <connectionStrings> tagını açıyoruz ve <add> tagı ile veritabanımızın yolunu belirtiyoruz. Burada dikkat etmemiz gereken önemli bir husus <add name=”ETradeContext”> add tagının name özelliğinin ismi tanımladığımız Context sınıfının ismiyle aynı olmalıdır. Çünkü ETrade classı default olarak ETradeContext adında bir connection string yolu arar.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<connectionStrings>
<add name="ETradeContext" connectionString="Server=(localdb)\MSSQLLocalDB; Database=CodeFirstExample; Trusted_Connection=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
Bu aşamada artık projemiz derlendikten sonra Context sınıfmız default olarak ismine sahip connection stringe arayıp bağlantı kurup string üzerinde belirtiğimiz database ismi ile bize veritabanını oluşturacak ve aynı zamanda context sınıfı içersinde set ettiğimiz product sınıfını tablo olarak veritabanımıza yerleştirecektir. Şimdi code first ile oluşturduğumuz veri tabanımıza ekleme, silme, güncelleme ve listeleme işlemlerini gerçekleştirelim.
Code First Veri Ekleme (Insert)
Bu aşamadan sonra bütün işlemlerimizi projemizin anasınıfı olan program.cs sınıfı içerisinde gerçekleştireceğiz.
Burada önemli hususu veri ekleme, güncelleme, silme ve listeleme gibi tüm veri işlemlerini oluşturduğumuz Entity Freamwork ün DbContext sınıfından türettiğimiz context sınıfının özelliklerinden faydalanarak gerçekleştireceğiz. Diğer bir deyişle bu aşamadan sonra ki tüm işlemleri entity yapasının bize sunduğu imkanları kullanarak gerçekleştireceğiz.
static void Main(string[] args)
{
AddProduct();
}
private static void AddProduct()
{
ETradeContext eTradeContext = new ETradeContext();
//Context sınıfımızı çağrıyoruz.
var product = new Product() { Name = "Laptop", UnitPrice = 7555.99M, StockAmount = 50 };
//Produc sınfımızı kullanarak tabloya eklemek istediğimiz verilerimizi product adında bir değişkene atıyoruz.
eTradeContext.Entry(product).State = EntityState.Added;
//Oluşturduğumuz product değişkenini Entity nin Add özelliğini kullanarak Context sınıfmız üzerinde veritabanımıza eklenmesini sağlıyoruz.
eTradeContext.SaveChanges();
//Yapılan değişikliklerin kayıt edilmesini sağlıyoruz.
Console.WriteLine("Ürün Eklendi");
Console.ReadLine();
}
Code First Veri Listeleme (Select)
Veri listeme yani select işlemi için context sınıfımızda tanımladığımız Product propertisini ToList() methodu ile derlememiz yeterli olacaktır.
private static void SelectProduct()
{
ETradeContext eTradeContext = new ETradeContext();
//Context sınıfımızı çağrıyoruz.
var list = eTradeContext.Products.ToList();
//Context sınıfımızın product nesnesini ToList() methodu ile değişkene atıyoruz.
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("ID: " + list[i].ID + " Ürün Adı: " + list[i].Name + " Ürün Fiyat: " + list[i].UnitPrice + " Stok: " + list[i].StockAmount);
}
//Atanana listelerimizin içinde for ile dönerek verilere tek tek ulaşıyoruz.
Console.ReadLine();
}
Code First Koşul İfadesi (Where)
Entity Framework, üç farklı sorgu türünü destekler. 1) LINQ-to-Entities, 2) Entity SQL, and 3) Native SQL
Biz bu örneğimizde ki koşulu Ling To kullanarak gerçekleştireceğiz. Diğer konularda detaylı bilgi için aşağıda linki inceleyebilirsiniz.
https://www.entityframeworktutorial.net/Querying-with-EDM.aspx
private static void SelectProductWhere()
{
ETradeContext eTradeContext = new ETradeContext();
var list = eTradeContext.Products.Where(p => p.Name == "Laptop").ToList();
//Product nesnemizi where methodu ile koşul sağlayabiliyoruz. Burada dikkat edilmesi gereken konu where koşulunu lambda kullanarak tanımlıyoruz. Lambda olarak atadığımız p simgesi listedeki her bir elemanı temsil eder.
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("ID: " + list[i].ID + " Ürün Adı: " + list[i].Name + " Ürün Fiyat: " + list[i].UnitPrice + " Stok: " + list[i].StockAmount);
}
Console.ReadLine();
}
Code First Veri Güncelleme (Update)
private static void UpdateProduct()
{
ETradeContext eTradeContext = new ETradeContext();
var product = new Product() { ID = 1, Name = "UltraBook" };
eTradeContext.Entry(product).State = EntityState.Modified;
eTradeContext.SaveChanges();
Console.WriteLine("Ürün Güncellendi");
Console.ReadLine();
}
Code First Veri Silme (Delete)
private static void DeleteProduct()
{
ETradeContext eTradeContext = new ETradeContext();
var product = new Product() { ID = 3 };
eTradeContext.Entry(product).State = EntityState.Deleted;
eTradeContext.SaveChanges();
Console.WriteLine("Ürün Silindi");
Console.ReadLine();
}
Projenin tamamına GitHub üzerinden erişebilirsiniz. İyi çalışmalar…
Merhaba,
Code-first yaklaşımında veritabanı için “Enable-Migrations” komutu ile “migration” işlemi de yapılıyor, buna da yer verseydiniz iyi olurdu düşüncesindeyim. Katkı vermek istedim. Teşekkürler.