Linq i her alanda kullanacağımız günler çok yakındır belki ama günümüzde en popüler kullanımı Ado.Net Entity Framework yapısıyla beraber kullanmaktır. Bu yazımızda basit bir projemize basit bir entity data modeli ekleyip işimize yarayacak bazı elemanlarını inceleyeceğiz.
Bu ve bundan sonraki veritabanı örneklerimizde Sql serverin hazır veri tabanı northwind ile çalışmalar çalışacağız.
Temel olarak entity framework un amacı veri tabanına nesneye yönelik bir arayüz oluşturmaktır diyebiliriz. Önceleri bu işleri business object modeller kullanarak yapıyorduk. Database to class gibi bazı third party yazılımlar mutlaka kullanmış yada incelemişizdir. Sonuca odaklanarak; yani veritabanına erişimler, sqller, function procedure vs gibi işlerin kodlamalarıyla fazla zaman geçirmek istemediğimiz yazılımlarda olmazsa olmaz bir yapı idi. Yani programcı bir sql i nasıl yazacağına değil; işin nasıl işleyeceğine yön verici yazılımları yaparak veritabanı işlemlerini ise bu class lara bırakmaktaydı. Amaç illaki veri tabanındaki tablolar olmayabilir, fakat böyle bir arayüze olan ihtiyaç kaçınılmazdı. O/R Mapping (Object relational mapping) diyebileceğimiz bu yapıya microsoft entity framework modeli ile ciddi bir giriş yapmıştır.
Şimdi biraz kodlama yapalım ve hızlı bir şekilde kendi modelimizi oluşturalım:
İlk olarak boş bir windows form application projesi oluşturuyoruz. Form üzerine bir button ve birde DataGridView ekliyoruz.
Solution explorerda projemizin üzerine sağ tıklayıp add new item seçip data sekmesinden ADO.NET Entity Model i seçiyoruz.

Şimdi bize entity modelimizi nasıl oluşturmak istediğimizi soruyor. Generate from Database i seçiyoruz. Boş bir model de oluşturabiliriz ama biz hızlı bir şekilde modelimizi tanımlayıp üzerinde birkaç işlem yapmak peşindeyiz.
Sonraki adımda connectionstringimizi soruyor. Burada alt tarafa dikkat edersek oluşturduğumuz connectionstringi aynı zamanda app.config dosyasınada kaydediyor.

Bir sonraki adımda ise oluşturacağımız modelde neler olması gerektiğini seçiyoruz. Dikkat edersek burada tablolar, viewlar ve stored procedure lar var. Ben sadece category ve products tablolarını seçiyorum ve finish buttonuna basıyorum.

İşte bu kadar basitti. Entity modelimiz artık hazır. Direk kullanmaya başlayabiliriz. Şimdi dikkat edersek modelimizde iki tane tablo var ve aralarında category de 0..1 product te ise * bağlantı kurulmuş durumda. Bunun anlamı şudur: product tablomuzdaki foreign key tanındı ve category tablosu ile bağlantısı sağlandı.

Bu bağlantıları üç şekilde yapabilmekteyiz:
* (Many) : Bir category e birden fazla product bağlanması örneği.
0..1 (Zero or One) : bir product sadece bir category e bağlıdır.
1 (One) : Birebir ilişki. Şimdilik buna vereceğimiz örnek yok :) Products tablosu için exProduct gibi ekstra alanların tanımlı olduğu nadiren kullanıln bir tablo açtığımızda bu bağlantımızda 1 e örnek olacaktır.
Bu bağlantı şekillerine müdahale etmeyeceğiz ama ileride etmemiz gereken zamanlar da gelebilir. Şimdilik microsoft nasıl istiyorsa o şekilde bağlantı kursun rahat bırakalım.
Dikkat edersek solution explorer in yanında birde model explorer i görüyoruz artık. Model explorer bize modelin içeriğini göstermektedir. Modelin temel yapısı entity, association ve function lardan oluşur. entity ler nesnelerimizi, association lar nesnelerimiz arasındaki ilişkileri, functionlar ise veritabanımızdaki stored procedure lardır. Şimdilik çok esnek stored procedure kullanım yapısı bulunmamakla birlikte ileride kesinlikle stored procedure lar içinde kullanım kolaylıkları getirileceğini tahmin ediyorum.
Burda şekil olarak gördüğümüz modelimizin arkasında bazı kodlar oluşmuştur. Bunlar: Model1.cs, Model1.csdl, Model1.msl ve Model1.ssdl dosyaları dır. Dikkat edersek connection stringimizde bile bu dosyaları görebiliriz. Yani edmx uzantılı dosya aslında bu dört dosyanın görselleştirilmiş halidir diyebiliriz. Farklı veritabanları için çalışacaksak görsellik imkanımız olmayabilir, temelinde bu dosyalar olduğunu bilip buna göre provider larimizi yazabiliriz.
Temelde yatan bu dosyalardan bahsedecek olursak:
ssdl - veri tabanımızdaki kullanacağımız elemanların (entity, association, functions vs) tanımlandığı dosyadır.
csdl - class ımızda kullanacağımız elemanlar
msl - ssdl ve csdl yani veri tabanı ile class ımız arasındaki birebir map leme (eşleştirme) işleminin tanımlandığı dosyadır.
İleride fırsat olursa bunlar hakkında da bir yazı yazabilirim. Veri tabanında farklı lanse edilmesine rağmen kendi kurallarımıza göre bu dosyaları oluşturup kurallarını bizim belirlediğimiz çalışma şekillerini oluşturabiliriz. Bazı tablolar için (mesela üye) tüm alanların erişilebilir olmasını istemeyebiliriz. select * sorgusunuda özelleştirip select * ile çektiğimizde bile alanların gelmemesini kendi özel tanım query data lerini oluşturarak sağlayabiliriz. Tabi bunlar hep havada kalıyor, şu anda sadece giriş konusundayız ve bunları sadece yapılabilir şeyler olarak bir kenara not edelim ve konuyu fazla dağıtmadan birkaç örnek yapmaya başlayalım:
Şu anda programımızı yazmak için herşeyimiz hazır.
Eğer Model1 namespace ini değiştirmemişsek kendi classımızın başında import etmemizgerekir:
using NorthwindModel;
İlk olarak buttona tıklayınca category list i datagridView e dolduran programı yazalım:
private void button1_Click(object sender, EventArgs e)
{
using (NorthwindEntities ne = new NorthwindEntities())
{
dataGridView1.DataSource = ne.Categories.ToList();
}
}
İşte herşey bu kadar basit. Gördüğümüz gibi veri tabanı ile ilgili hiç bir kod yazmadım. Toplam iki satırda connection açtı, kategori listesini getirdi, gride yazdırdı, sonrada connection u kapattı. Görmediğimiz bizi şimdilik ilgilendirmeyen arka planda bunlar yaşandı.
Şimdi "Condiments" category ine ait product leri listeletelim:
private void button1_Click(object sender, EventArgs e)
{
using (NorthwindEntities ne = new NorthwindEntities())
{
var mP = ne.Categories
.Include(ne.Products.CommandText)
.Where(c => c.CategoryName == "Condiments")
.FirstOrDefault()
.Products;
dataGridView1.DataSource = mP.ToList();
}
}
Burada dikkat edeceğimiz nokta include ile products un dahil edilmesi. Dahil etmeseydik kullanmadan önce load etmemiz gerekirdi. Bu dahil edilme işlemi yukarıda gördüğümüz * bağlantısı sayesinde gerçekleştirildi, categories altında o categories e ait olan products kodlama esnasında tanınır durumda oldu. Eğer bu şekilde ilişki kurulmamış olsaydı ne olurdu, tabiki dünyanın sonu olmazdı ama birkaç kod daha yamamız gerekirdi, products u join etmemiz gerekirdi. Bundan kurtulmuş olduk.
Burada dikkat edeceğimiz bir diğer noktada şu. Products u incelediğimizde categoryID sinin veritabanında tanımlı olmasına rağmen nesnemizde böyle bir ID özelliğinin olmadığını görürüz. Bu şu demektir. Artık productumuzun category id sine gerek kalmadı, zaten ihtiyacımız olduğu anda category si yanımızda. illede bu numarayı öğrenmek istiyorsak pruducts.category.categoryid ile öğrenebiliriz.
Yukarıdaki veri listeletme örneklerini linq ile sınırsız genişletebiliriz fakat işin özü yukarıdaki gibidir. Mümkün olduğunca sade ve yaptığımız işlerin temelinde neler olduğunu hızlıca anlatmaya çalıştım. Umarım faydalı olmuştur. Derinlemesine veritabanı örneklerimize devam edeceğiz, şimdilik bu kadar,
Sağlıcakla kalın
Gökhan Köseoğlu
3 kişi tarafından 3.7 olarak değerlendirildi
- Currently 3,666667/5 Stars.
- 1
- 2
- 3
- 4
- 5