Entity Framework Nedir? Kurulumu ve Kullanımı
Entity Framework veya EF .NET platformu için geliştirilen ORM aracı nedir, kurulumu, kullanımı, komutları, model first, code first dersleri yer alıyor.
Entity Framework nedir?
Entity Framework 2008 yılından itibaren Microsoft tarafında geliştirilen ORM aracıdır.
ORM nedir?
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.
Böylece yazılım geliştirici veritabanı ve SQL komutlarına ihtiyaç duymadan yazılım geliştirebilir.
Neden kullanılır?
.NET veya herhangi bir programlama dili ile veritabanı uygulamaları yaparken ilk olarak veritabanı bağlantısı yapılır.
Daha sonra SQL komutları ile veritabanındaki veriler alınır.
Alınan veriler programlama diline uygun veri yapılarında saklanarak işlem yapılır.
Verilerin programlama diline uygun veri yapılarına dönüştürülmesi sırasında beklenmedik hatalar, sorunlar oluşabilir.
Ayrıca karmaşık veritabanı sorguları geliştirmeyi daha da zor hale getirir.
ORM araçlarının temel kullanım nedeni bu ve bunun gibi sorunları ortadan kaldırmaktır.
Entity Framework gibi ORM araçları farklı veri sağlayıcıları (SQL Server, MySQL, SQLite gibi) için aynı komutları kullanarak işlem yapmaya imkan verir.
Entity Framework kurulumu
Entity Framework ORM aracı bir Nuget paketi olduğundan Visual studio geliştirme ortamında projeye sağ tıklayıp Manage NuGet Packages seçeneği ile kurulum yapılabilir.
Ayrıca Package Manager Console alanına aşağıdaki komut yazılarakta indirilebilir.
Install-Package EntityFramework
Nuget paket yönetici hakkında detaylı bilgi için NuGet Nedir? yazıma bakabilirsiniz.
Model oluşturma
Entity Framework ile model oluşturmak için Database First, Model First ve Code First yaklaşımları kullanılır.
Database First
Bu yapıda daha önceden hazırlanmış veritabanı tablolarına uygun nesneler Visual Studio veya komut satırı ile otomatik olarak oluşturulur.
Bu işlem için Visual Studio IDE ile projeye ADO.NET Entity Data Model ve EF Designer from database seçeneği ile veritabanı bağlantısı yapılarak işlem yapılacak tabloların eklenmesi yeterli olacaktır.
İşlem sonucunda veritabanına ait uygun sınıf oluşturulacaktır.
Model First
Bu yapıda Database First yapısına benzer şekilde ADO.NET Entity Data Model ve EF Designer from model seçeneği ile oluşturulur.
Oluşturulan modele görsel olarak tablolar, tablo alanları eklenerek model oluşturulur.
Code First
Yukarıda yer alan Database First ve Model First ile aslında yapılan görsel arayüz üzerinden veritabanı veya modele uygun kodların oluşturulmasıdır.
Code First yaklaşımında ilk olarak tabloya karşılık gelen sınıf ve özellikler yazılır.
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string FullName => $"{FirstName} {LastName}";
}
Code First ile geliştirme sırasında modeli oluştururken Data Annotations veya Fluent API ile özellik sınırının belirlenmesi faydalı olacaktır.
Çünkü Entity Framework string türünden bir değer için veritabanında NVarchar(MAX) gibi bir tür belirleyecektir.
Model içerisinde yer alan ID özelliği varsayılan olarak Entity Framework tarafından birincil anahtar olarak belirlenir.
ID isimlendirmesinden farklı bir alan için yine nitelik (Key) veya Fluent API kullanılabilir.
Ancak daha sonra olası değişiklik için ID kullanmak faydalı olacaktır.
Entity Framework enum ile hazırlanan özellikler içinde varsayılan olarak veritabanında int türünü seçer.
Enum türleri genellikle az boyutlu olduğundan byte gibi bir tür belirlemek faydalı olacaktır.
DbContext
Sınıf ve özellikler belirlendikten sonra System.Data.Entity alanında yer alan DbContext sınıfından kalıtım alınarak veritabanı işlemlerini yapan sınıf oluşturulur.
Veritabanı işlemlerinin yapıldığı sınıf içerisine model DbSet türünden özellik olarak eklenir.
class PeopleContext : DbContext
{
public PeopleContext() : base() { }
public DbSet<Person> People { get; set; }
}
Veritabanı işlemlerinin yapıldığı DbContext sınıfı veritabanı bağlantı yöntemine göre çeşitli kuruculara sahiptir.
Parametre olarak herhangi bir değer verilmediğinde Namespace.SinifAdi veritabanına bağlanacaktır.
Parametre olarak bir bağlantı cümlesi belirtildiğine belirtilen bağlantı cümlesine ait veritabanına bağlanacaktır.
public PeopleContext() : base("BaglantiCumlesi") { }
public PeopleContext() : base("name=Baglanti") { }
Parametre olarak Baglanti verildiğinde App.Config veya Web.Config içerisinde Baglanti adına karşılık gelen değeri kullanacaktır.
<connectionStrings>
<add name="Baglanti"
connectionString="Data Source=.;Initial Catalog=Veritabani;Integrated Security=true"
providerName="System.Data.SqlClient"/>
</connectionStrings>
Migration
Gerekli model ayarlanıp veritabanı bağlantısı ayarları yapıldıktan sonra tabloların oluşturulması için Migration işleminin yapılması gerekir.
Migration göç, göçme anlamına gelir ve model oluşturulduktan veya değiştirildikten sonra değişikliğin veritabanına yansıtılmasını sağlar.
Bu işlem için Visual Studio editöründe Package Manager Console alanına aşağıdaki komutun yazılması yeterli olacaktır.
Enable-Migrations
Komut sonucunda proje klasöründe Migrations klasörü ve Configuration dosyasını oluşturacaktır.
Migration aktif edildikten sonra aşağıdaki komut ile yeni bir Migration oluşturulması gerekir.
Add-Migration MigrationAdi
Migration oluşturma işlemi sonrası Migrations klasöründe tarih_MigrationAdi dosyasında tablo oluşturma komutları yer alacaktır.
Migration oluşturulduktan sonra aşağıdaki komut ile oluşturulan Migration veritabanına yansıtılır.
Update-Database
Migration işleminin otomatik olarak yapılması için Configuration dosyasındaki AutomaticMigrationsEnabled değerini true olarak değiştirme yeterli olacaktır.
Fluent API
Code First yaklaşımında model oluşturulduğunda Entity Framework varsayılan veri türlerini kullanacaktır.
Tablolar arası ilişkide de benzer şekilde Entity Framework tarafından yapılmaya çalışılacaktır.
Varsayılan ayarlar DbContext sınıfında yer alan OnModelCreating metodu override edilerek Fluent API yöntemiyle aşağıdaki gibi düzenlenerek tablo, alan ve tablolar arası ilişkiler düzenlenebilir.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Property(p => p.FirstName)
.HasMaxLength(100)
.IsRequired();
}
NOT: Değişiklik sonrası yeni bir Migration oluşturulması gerekir.
Veri ekleme
Gerekli olan işlemler yapıldıktan sonra aşağıdaki gibi kayıt ekleme işlemi yapılır.
var context = new PeopleContext();
var person = new Person { ID = 1, FirstName = "Yusuf", LastName = "Sezer", Email = "[email protected]" };
context.People.Add(person);
context.SaveChanges();
Veri güncelleme
var context = new PeopleContext();
var person = context.People.Where(p => p.ID == 3).FirstOrDefault();
if (person != null)
{
person.FirstName = "Yusuf Sefa";
person.LastName = "Sezer";
context.SaveChanges();
}
Veri silme
var context = new PeopleContext();
var person = new Person { ID = 1 };
context.People.Attach(person);
context.People.Remove(person);
context.SaveChanges();
veya
var context = new PeopleContext();
var person = new Person { ID = 2 };
context.Entry(person).State = EntityState.Deleted;
context.SaveChanges();
Sorgulama
Entity Framework ORM aracının en önemli özelliği .NET içerisinde verileri sorgulamak için kullanılan LINQ yapısını kullanıyor olmasıdır.
Bu yapı sayesinde veri sağlayıcıya ait SQL komutlarına ihtiyaç duymadan aşağıdaki gibi sorgular yazabiliriz.
var context = new PeopleContext();
var person = context.People
.Where(p => p.FirstName == "Yusuf Sefa" && p.LastName.Contains("Sezer"))
.FirstOrDefault();
if (person==null) {
Console.WriteLine("Kayıt bulunamadı.");
}
else {
Console.WriteLine("{0} {1} {2}", person.FirstName, person.LastName, person.Email);
}
veya
var context = new PeopleContext();
var person = (from Person in context.People
where Person.FirstName == "Yusuf Sefa" && Person.LastName.Contains("Sezer")
select Person).FirstOrDefault();
if (person==null) {
Console.WriteLine("Kayıt bulunamadı.");
}
else {
Console.WriteLine("{0} {1} {2}", person.FirstName, person.LastName, person.Email);
}
Entity Framework ile esnek sorgular hazırlamak için LINQ yapısını öğrenmek faydalı olacaktır.
Entity Framework sorgulama işlemlerinde select ile sadece ilgili alanları veritabanından almak performans açısından faydalı olacaktır.
Entity Framework nasıl çalışır?
Entity Framework .NET içerisinde yer alan List, Directory gibi LINQ temelli çalışır.
Veritabanı işlemlerinin yapıldığı sınıfta yer alan özelliklere değerler Add, AddRange gibi metotlarla eklenir.
İşlemin veritabanına yansıması için DbContext sınıfında yer alan SaveChanges metodunun çalıştırılması gerekir.
Metot çalıştıktan sonra eklenen değerin System.Data.Entity.EntityState alanında yer alan Added, Modified, Deleted, Unchanged, Detached değerlerine göre işlem yapar.
Ekleme işlemi yapıldığında değer Added, Düzenleme yapıldığında Modified değerini, … alır ve veri sağlayıcısına uygun komutları çalıştırarak gerekli işlemi yapar.
Eklenen değerin durumu ile ilgili bilgi almaka için DbContext sınıfında yer alan Entry metodu kullanılabilir.
Console.WriteLine(context.Entry(person).State);
.NET Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.