ADO.NET Entity. Abdullah UĞRAŞKAN Web Developer. apostylee.com twitter.com/apostylee

Benzer belgeler
ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ

Android Ders Notları

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

VERİ TABANI NEDİR A. TABLO OLUŞTURMA

Masa üstünde vt34.mdb dosyası var, onu projemize eklemek için, App_Data ya sağ tıkla Add Existing Item vt34.mdb adlı dosyayı seç Add

ADO.NET VERİTABANINA BAĞLANTI. Bir web formu üzerinden veritabanına bağlantımızı anlatacağım. UYGULAMA 1

YZM 3215 İleri Web Programlama

1.adım : Sql serverda Stored procedure oluşturmamız gerekiyor. Şu adımları izliyoruz.

1. Hafta MS SQL Server 2008 Kurulum ve Tanıtımı BPR255 Veritabanı. Bu Derste Öğrenecekleriniz: Kurulum:

Herhangi bir tablonun tekrarlı veriler içerdiği duruma birinci normal form denir. Birinci normal formu Aşağıdaki tablo ile ele alacağız.

1. Oracle Data Miner 11g Release 2 Kurulumu Aşamaları

MOBİL UYGULAMA GELİŞTİRME

Virtualization. VMware vcenter Server Yapılandırılması

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

SQL e Giriş. Uzm. Murat YAZICI

Mikro Ayarları. Mikro Programının kurulu olduğu veritabanı ve web servisi için bağlantı ayarlarının yapıldığı menüdür.

Sqlmap pyhton dili yazılarak geliştirilmiş Sql injection için testerlara son derece yardımcı olan bir araçtır.

Microsoft SQL Server 2008 Oracle Mysql (Ücretsiz) (Uygulamalarımızda bunu kullanacağız) Access

ADO.NET Entity. Framework. Temel Kavramlar

İnternet Programcılığı

Tavsiye Edilen Önhazırlık Temel SQL Server 2000 bilgisi edinmek.

Bölüm 10: PHP ile Veritabanı Uygulamaları

Tavsiye Edilen Önhazırlık Temel veritabanı kavramlar hakkında bilgi sahibi olmak. Hedefler Temel veritabanı güvenlik işlemlerini gerçekleştirebilmek

ÇÖZÜM BİLGİSAYAR KOLAY RANDEVU RANDEVU WEB SERVİSLERİ YAZILIM FİRMALARI ENTEGRASYON KILAVUZU Sürüm: 1.0

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler

İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler:

Veritabanı İşlemleri

Bu classı biraz açıklamak gerekirse, tam olarak şu işleri yapıyor.

DetailsView. DetailsView kontrolünün GridView kontrolüyle paralel şekilde kullanımı ile ilgili örnek

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

BLGM 354 DENEY 1 * GİRİŞ

Yaptığımız web sitelerinin daha kullanışlı olması için veritabanı sistemleri ile bağlantı kurup ihtiyaca göre verileri okuyup yazmasını isteriz.

5 SQL- Yapısal Sorgulama Dili. Veritabanı 1

BM-209 Nesne Yönelimli Programlama. Yrd. Doç. Dr. İbrahim Alper Doğru Gazi Üniversitesi Teknoloji Fakültesi Bilgisayar Mühendisliği Bölümü

Vega Ayarları. Vega Programının kurulu olduğu veritabanı ve web servisi için bağlantı ayarlarının yapıldığı menüdür.

İNTERNET TABANLI PROGRAMLAMA- 8.ders VERİTABANI İLE İLGİLİ BİLGİLERİ GÖRÜNTÜLEME, KAYDETME, GÜNCELLEME VE SİLME

Samsun Çocuk Hizmetleri İ l Koordinasyon Sekretarya Birimi

Örnek Excel Formatını Nereden Bulabilirim?

A- VERİTABANI BAĞLANTISINI HAZIR NESNE KULLANARAK YAPMA

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

STORED PROCEDURE LER (Saklı Yordamlar)

Listview Kullanımı. Aşağıdaki örnekte bir ListView'ı birkaç ülke ismiyle dolduracağız.

Cyberoam Firewall Kullanıcı ve Grup Oluşturma

VeriTabanı Uygulamaları

Elbistan Meslek Yüksek Okulu GÜZ Yarıyılı Ara Öğr. Gör. Murat KEÇECĠOĞLU

Bölüm 4: DDL Veri Tanımlama Dili

1- UETDS-TİMBSOFT Nasıl İndirilir? 2- UETDS-TİMBSOFT Nasıl Yüklenir? 3- UETDS-TİMBSOFT a Nasıl Giriş Yapılır? 4- Personel Nasıl Eklenir ve

MEBWEB OKUL/KURUM WEB SİTELERİ KULLANIM KLAVUZU TEMEL İŞLEMLER

DESTEK DOKÜMANI. Ürün : Tiger Enterprise/ Tiger Plus/ Go Plus/Go Bölüm : Kurulum İşlemleri

Aşağıdaki programı inceleyip ekrana ne yazacağını söyleyebilir misiniz?

Veritabanı Tasarımı. NOT NULL ve UNIQUE Kısıtlamaları Tanımlama

VERİ ANALİZ KÜPLERİ. Küp Tasarım Formu (504200)

Oracle da kullanılan veri tipleri:

Veritabanına Giriş. Oğuzhan Ceylan. 19 Eylül 2011

Exchange Server 2010 Sertifika Oluşturma

SQL Komutları (2) Uzm. Murat YAZICI

Üst Düzey Programlama

Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız.

Geliştirme Klavuzu İlk Uygulama Hello World

E-Firma Rehberi Sistemi Plus

ÜNİTE NESNE TABANLI PROGRAMLAMA I. Uzm. Orhan ÇELİKER VERİTABANI SORGULARI İÇİNDEKİLER HEDEFLER

Veri Tabanı SQL Server ve Management Studio kurulum linkleri:

Tableau Yenilikler

BLIND SQL INJECTION SALDIRILARI

PORT HABERLEŞME SERİ PORT FARUK BOZAN

İLERİ VERİTABANI SİSTEMLERİ SUAT ÜSTKAN

VERİTABANI Veritabanı Yönetimi

SQL SERVER 2005 ENTEGRE SQL (VTY) VERİ TABANI YÖNETİM KURULUMU RESİMLİ ANLATIMI. Entegre SQL kurmadan önce SQLSERVER 2005,i kuralım öncelikle.

İngilizce'de Relational Database Management System (RDBMS) olarak ifade edilir.

Genel Programlama II

Önce Access açıp,masaüstü ne, vt.mdb adlı veri tabanı dosyasını oluşturuyoruz. Kayıt türünü seçiyoruz

BlackBerry Admin Service

Aşağıdaki tabloyu inceleyin. Sorgulama işlemlerini bu tabloya göre yapacağız.

LUCA Bilgisayarlı Muhasebe Programı. Öğr. Gör. Coşkun Aliyazıcıoğlu KTÜ Beşikdüzü Meslek Yüksekokulu Mayıs- 2018

BÖLÜM- 9: KULLANICI ERİŞİMLERİNİ YÖNETMEK

Veritabanı Tasarımı. Kullanıcı Erişimini Kontrol Etme

WebInstaller. 1. Kurulum Đçin Gereksinimler

Sağ Tıkla. 5 Ocak 2012 / Perşembe. Yeni bir site açıyoruz. File New Web Site Browse yeni klasör ocak5persembe OK

CYGWIN KURULUMU ve KULLANIMI

Dreamspark Nedir? ÖNEMLİ NOT: Parolanız türkçe karakter içeriyorsa türkçe karakter içermeyen bir parolayla değiştirmelisiniz.

Kullanım Kılavuzu Milli Eğitim Bakanlığı 2010

NEUTRON DDNS KURULUMU

Bu uygulamayı yapabilmek için SQL Server'da Query Analyzer kullanabilmekle beraber, ADO.NET bilgisine sahip olmanız gerekir.

Veritabanı Yönetimi Bilgisayarların. Keşfi Hedefler. Veritabanı, Veri ve Bilgi. Veritabanı, Veri ve Bilgi. Veritabanı, Veri ve Bilgi

Global Haberleşme API Kullanıcı Notları

PERKON PDKS Kurulum ve hızlı başlangıç rehberi

Sadece 2 İstekle MySQL Blind SQL Injection. Canberk BOLAT canberk.bolat[-at-]gmail[-dot-]com

XSS Exploitation via CHEF

1 C#.NET GELİŞTİRME ORTAMI 1 Visual Studio 2015 Arayüzü 4 Menu Window 6 Solution Explorer 7 Properties Window 8 Server Explorer 8 Toolbox 9

SQL Server 2008 kurulum için Microsoft Windows Installer 4.5 ve üzeri bileşenin bilgisayarınızda kurulu olması gerekir. İndirmek için tıklayın

İNTERNET PROGRAMLAMA 2 A S P. N E T. Marmara Teknik Bilimler MYO / Hafta 5 Veri Tabanı İşlemleri

ADO.NET. Öğr. Gör. Emine TUNÇEL Kırklareli Üniversitesi Pınarhisar Meslek Yüksekokulu

Yukarıdakilerden hangileri DML (Data Manipulation Language) ile gerçekleştirilir?

Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız.

Ders Tanıtım Sunumu. Database Managegement II. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

Ders Tanıtım Sunumu. Database Managegement II. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

Atılım Üniversitesi Bilgi & Đletişim Teknolojileri Müdürlüğü. AKTS Veri Girişi, CMS - Yönetim Paneli Kullanıcı Kılavuzu

Transkript:

ADO.NET Entity Abdullah UĞRAŞKAN Web Developer apostylee.com twitter.com/apostylee 1

İ çindekiler ADO.NET ENTİTY NEDİR?... 3 NEDEN ENTİTY?... 3 MODEL YAKLAŞIMLARI... 3 BASİT BİR MODEL... 4 DBCONTEXT... 4 EKLE, LİSTELE, DÜZENLE VE SİL (CRUD)... 5 DOĞRULAMA (VALİDATİON)... 7 İLİŞKİLER (RELATİONSHİP)... 8 1 DEN ÇOĞA (1 TO N) İLİŞKİ... 8 ÇOKTAN ÇOĞA (N TO N) İLİŞKİ... 11 COMPLEXTYPE... 12 ADO.NET FLUENT APİ... 14 İPUÇLARI... 15 WHERE... 15 SELECT... 15 ORDERBY... 15 TOP, MAX, MİN... 15 SQLQUERY, EXECUTESQLCOMMAND... 16 SON SÖZ... 16 2

Ado.Net Entity Nedir? Ado.Net Entity, Microsoft un Orm 1 aracıdır. Bu araçlar, veritabanı işlemlerini nesneler üzerinden yapmamıza olanak sağlayan yapılardır. Veritabanında bulunan her tabloya karşılık gelen bir nesne bulunmaktadır. Veritabanına ekleme, silme, listeleme vb.. işler bu nesneler kullanılarak, güvenli ve hızlı bir şekilde yapılır. Orm araçlarının diğer bir özelliğide veritabanı bağımlılığını ortadan kaldırmasıdır. Projenizi mssql veritabanı kullarak geliştirip sonrasında mysql e çevirebilirsiniz. Buna imkan veren ise; projenizde sql kodu kullanmadan her şeyi nesneler üzerinden gerçekleştirmenizdir. Neden Entity?.Net projelerimizde farklı orm araçları kullanmamızda mümkün, örneğin nhibernate. Bizim Entity i seçmemizdeki en büyük etken, Microsoft un ürünü olması ve Visual Studio ile birlikte gelen özelliklerle birlikte çok daha etkin kullanılabiliyor olması. Model Yaklaşımları Ado.Net Entity Framework bize modelimizi oluşturmamız için 3 seçenek (Şekil 1) sunuyor. Bunlar; 1. Database First Var olan bir veritabanından modelimizi oluşturduğumuz yaklaşım. 2. Model First Oluşturduğumuz data modelden 2, veritabanını oluşturduğumuz yaklaşım. 3. Code First Model sınıflarını elle yazdığımız yaklaşım. Bizim ilgileneceğimiz yaklaşım bu olacak. Şekil 1 (Model Yaklaşımları) 1 Orm; Object-relational mapping kelimelerinin kısaltılmış halidir. Detaylı bilgiye buradan ulaşabilirsiniz. 2 Data Model; modeli bir editör tarafından tasarladığımız ve modelimize ait sınıfları, metotları ve diğer kodları otomatik oluşturan yaklaşım oluyor. 3

Basit bir model Model; veritabanında ki tablomuza karşılık gelen bir sınıftır (class). Modelimiz de aynı zamanda ilişkileride (relationship) tanımlıyoruz, bunu ilerleyen sayfalarda göreceğiz. public class kullanici public int id get; set; public string adi get; set; public string soyadi get; set; public string eposta get; set; public string sifre get; set; public DateTime kayitzamani get; set; kullanici veritabanında ki tablo adını ifade eder. id, adi, soyadi.. tabloda ki alanları ifade eder. o id alanı entity framework tarafından otomatik olarak algılanıp, otomatik artan birincil anahtar (primary key) olarak belirlenir. Bu alanı tabloadiid (kullaniciid) şeklinde de kullanabiliriz. Farklı bir alanı birincil anahtar olarak belirlemek istersek, alanın başına [Key] açıklamasını (Annotations) eklememiz yeterli olacaktır. Bu olayı sağlayan Ado.Net Fluent Api adında ki yapı. İlerleyen sayfalarda detaylı bir şekilde değineceğiz. int, string, datetime.. alanların türlerini ifade eder. DbContext public class adonetkitapcontext : DbContext public DbSet<kullanici> kullanicis get; set; Oluşturduğumuz modelin anlam kazanması için bir bağlam (context) oluşturmamız gerekiyor. Bu context bizim modelimizi kullanıp veritabanı işlemlerimizi yapmamıza olanak sağlıyor. adonetkitapcontext hem contextimizin hemde web.config içerisine yazacağımız bağlantı cümlesinin (connection string) adı oluyor. DbSet<kullanici> kullanacağımız model sınıfımızı belirtiyoruz. kullanicis buda veritabanı işlemleri için kullanacağımız methodları içinde barındıran sınıfımızın adını ifade ediyor. Aynı zamanda veritabanı otomatik 3 oluşturulduğunda tablo adınıda ifade ediyor. Veri katmanımızı basitçe bu şekilde oluşturuyoruz. Şimdi basit bir örnekle veritabanına ekleme, listeleme, güncelleme ve silme (CRUD) işlemlerine bir göz atalım. 3 Orm araçları veritabanını modelinizdeki tanımlara göre otomatik olarak oluştururlar. Ado.Net Entity projenizi çalıştırdığınızda context içindeki tanımlara göre modelinizi oluşturacaktır. 4

Ekle, Listele, Du zenle ve Sil (CRUD) Yukarıda ki modelimizi kullanarak aşağıdaki gibi veritabanı işlemlerini yapabiliriz. Öncelikle web.config içerisine veritabanı bağlantısı için gerekli olan bağlantı cümlemizi yazıyoruz. Ben Sql Compact 4 4 veritabanını kullanıyorum. <add name="adonetkitapcontext" connectionstring="data Source= DataDirectory \db.sdf" providername="system.data.sqlserverce.4.0" /> public void Crud() // context imizi tanımlıyoruz. adonetkitapcontext context = new adonetkitapcontext(); // Kullanıcı modelimiz kullanici k = new kullanici(); k.adi = "Ahmet"; k.eposta = "ahmet@ahmet.com"; k.kayitzamani = DateTime.Now; k.sifre = "123"; // Veritabanına kayıt ekleme context.kullanicis.add(k); context.savechanges(); // Kayıtları listeleme var kayitlistesi = context.kullanicis.tolist(); // Kayıt güncelle int gkayitid = 1; var guncellenecekkayit = context.kullanicis.find(gkayitid); guncellenecekkayit.adi = "yeni değer"; guncellenecekkayit.soyadi = "yeni değer"; context.savechanges(); // Kayıt silme int skayitid = 1; var silinecekkayit = context.kullanicis.find(skayitid); context.kullanicis.remove(silinecekkayit); context.savechanges(); Görüldüğü üzere hiçbir sql kodu yazmadan veritabanı işlemlerini gerçekleştirdik. Şimdi arka planda neler olduğuna bir göz atalım. Gözlemleme işini Sql Server Profiler ile yapacağım için öncelikle web.config de bulunan bağlantı cümlemi Mssql veritabanı kullanmak için değiştiriyorum. * Orm araçlarının bir avantajıda veritabanı bağımsızlığıydı. <add name=" adonetkitapcontext" connectionstring="server=localhost;database=dbname;user ID=sa;Password=pass;" providername="system.data.sqlclient" /> 4 Sql Compact 4; ek yükleme yapmadan direk kullanabileceğiniz bir veritabanıdır. 4Gb a kadar verileri depolayabilir ve ücretsiz olduğundan dağıtımda düşük maliyet sağlar. Transact-SQL kullanımını destekler. Takım günlüğüne http://blogs.msdn.com/b/sqlservercompact/ adresinden ulaşabilirsiniz. 5

Crud işlemlerini çalıştırdığımızda Sql Server Profiler da gözlenen sql sorguları aşağıdaki gibidir. Ado.Net Entity nesnelerle gerçekleştirdiğimiz işlemleri bu şekle çevirip sql servera işletiyor. İşlemler parametre kullanılarak gerçekleştirildiğinden, sql enjeksiyon 5 saldırılarına karışıda güvenli bir hale geliyor. // Ekleme işlemi exec sp_executesql N'insert [dbo].[kullanicis]([adi], [soyadi], [eposta], [sifre], [kayitzamani]) values (@0, null, @1, @2, @3) select [id] from [dbo].[kullanicis] where @@ROWCOUNT > 0 and [id] = scope_identity()',n'@0 nvarchar(max),@1 nvarchar(max),@2 nvarchar(max),@3 datetime2(7)',@0=n'ahmet',@1=n'ahmet@ahmet.com',@2=n'123',@3='2011-07-12 17:16:30.3015048' go // Listeleme işlemi SELECT [Extent1].[id] AS [id], [Extent1].[adi] AS [adi], [Extent1].[soyadi] AS [soyadi], [Extent1].[eposta] AS [eposta], [Extent1].[sifre] AS [sifre], [Extent1].[kayitZamani] AS [kayitzamani] FROM [dbo].[kullanicis] AS [Extent1] go // Güncelleme işlemi exec sp_executesql N'update [dbo].[kullanicis] set [adi] = @0, [soyadi] = @1 where ([id] = @2) ',N'@0 nvarchar(max),@1 nvarchar(max),@2 int',@0=n'yeni değer',@1=n'yeni değer',@2=4 go // Silme İşlemi exec sp_executesql N'delete [dbo].[kullanicis] where ([id] = @0)',N'@0 int',@0=4 go 5 Sql enjeksiyon bir saldırı şeklidir. Buradan http://ferruh.mavituna.com/sql-injection-a-giris-ve-sql-injectionnedir-oku/ konuyla ilgili detaylı bilgiye ulaşabilirsiniz. 6

Doğ rulama (Validation) Veriler eklenirken yada düzenlenirken bazı kurallar çerçevisinde bu işlemler gerçekleştirilir. Bazı alanlar boş olamaz, sadece sayı olabilir yada girilen değer 5 haneli olabilir gibi.. işlemlere doğrulama (validation) diyoruz. Doğrulama işlemlerini modelimizin içindeki ilgili alanlara açıklamalar (Annotations) ekleyerek gerçekleştirebiliyoruz. Temel annotations lar System.ComponentModel.DataAnnotations 6 sınıfı içerisinde bulunuyor. public class kullanici public int id get; set; [Required] public string adi get; set; [Required(ErrorMessage="Bu alan boş olamaz"] public string soyadi get; set; public string eposta get; set; [MinLength(6,ErrorMessage="En az 6 karakterden oluşmalıdır.")] public string sifre get; set; public DateTime kayitzamani get; set; Eposta adresi doğrulama gibi özel bir durum 7 için ise kendi kişisel doğrulamamızı yazıp kullanabiliyoruz. public class EmailAttribute : RegularExpressionAttribute public EmailAttribute() : base(@"^([0-9a-za-z]([-.\w]*[0-9a-za-z])*@([0-9a-za-z][-\w]*[0-9aza-z]\.)+[a-za-z]2,9)$") public class kullanici [Email(ErrorMessage = "EPosta adresini lütfen doğru giriniz.")] public string eposta get; set; Eğer buraya kadar okuduysanız, öğrendiklerinizle ufak bir proje yapıp bilginizi pekiştirebilirsiniz. İlerleyen kısımlarda konunun detayına doğru iniyor olacağız. 6 http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx 7 Özel durumlara; dosya uzantısı, şifre doğrulama, adres formatı gibi şeyleri örnek gösterebiliriz, eğer her biri için ayrı ayrı kontrol yazmak istemiyorsanız ayrı bir kütüphane kullanabilirsiniz. Örnek olarak http://www.apostylee.com/dataannotationsextensions/ adresine bakabilirsiniz. 7

İ lişkiler (Relationship) Veritabanı tasarımındaki en önemli noktayı hiç şüphesiz tablolar arasında ki ilişkiler oluşturuyor. Veri bütünlüğü için hayati önem taşıyan bu noktada modellerimiz içine basit bir şekilde ilişkilerimizi tanımlayabiliyoruz. 1 den Çoğa (1 to n) İlişki Senaryomuz şu şekilde; bir kullanıcının birden fazla yazısı olabilir. Bu ilişkiyi gerçekleştirmek için yazi adında yeni bir model oluşturup kullanici modeliyle ilişkilendiriyoruz. public class yazi public int id get; set; public string baslik get; set; public string icerik get; set; public virtual kullanici kullanici get; set; public int kullaniciid get; set; public class kullanici public int id get; set; public string adi get; set; public string soyadi get; set; public string eposta get; set; public string sifre get; set; public DateTime kayitzamani get; set; public virtual ICollection<yazi> yazilar get; set; Yukarıda ki modellerimize baktığımızda yazi içerisinde kullanici ve kullaniciid yi belirtip, bir yazının bir kullanıcıya ait olduğunu belirtiyoruz. Kullanici tarafında ise ICollection<yazi> yazilar tanımını yapıp, bir kullanıcının birden fazla yazısı olacağını ifade ediyoruz. Oluşan ilişki aşağıda ki (Şekil 2) gibi olacaktır. Şekil 2 (Oluşan tabloların ilişkisi) Şimdi orm nin en zevkli kısmına sıra geldi! Uzun uzun sql cümleleri yazmadan ilişkili veriyi nasıl listeliyoruz bir bakalım. 8

var result = db.kullanicis.tolist(); var result2 = db.kullanicis.include(x => x.yazilar); Kullanıcılara ait yazıları yukarıdaki gibi iki şekilde çekebiliyoruz. Uygulamada birbirinden farksız gibi görünsede bu iki yöntem arasında ciddi bir fark bulunuyor. Bu farkı Sql Server Profiler ile inceleğimizde görüyoruz. result işleminde Lazy Loading 8 adı verilen bir durum oluşmaktadır. Bu durumda döngü sayısı kadar sql işlemi gerçekleşmektedir. Yani kullanıcılara ait yazıların listelenmesi için, kullanıcı sayısı kadar sql işlemi gerçekleştirilip ait olan yazılar gelmektedir. Sql server profillerde durumu izlediğimizde; Şekil 3 (Lazy Loading) Veritabanında ki 3 kullanıcı olduğundan her kullanıcı için yazılar isteniyor. Bu, çok yoğun olmayan durumlarda göz ardı edilebilir olsada aksi durumda ciddi bir performans kaybına yol açacaktır. 8 http://en.wikipedia.org/wiki/lazy_loading 9

result2 de bu durumu engellemek için yazi modelini kullanici modeline ekliyoruz (include). Bu sayede Ado.Net Entity Lazy Loading i Eager Loading (Şekil 4) e çeviriyor ve daha farklı bir durum oluşuyor. Şekil 4 (Eager Loading) Eager Loading durumunda tablolar bağlanarak tüm alanları çekilir. Yani tek bir sorguda istenilen tüm kayıtlar getirilir. Diğer yönteme göre daha performanslı olduğunu söyleyebiliriz. 10

Çoktan Çoğa (n to n) İlişki Bu seferki senaryomuz, birden çok yazının birden çok kategoriye ait olması. Bu durumu gerçekleştirmek için yukarıdaki modellerimizin yanına birde kategori adında bir model ekliyor ve gerekli değişiklikleri yapıyoruz. public class kategori public int id get; set; public string adi get; set; public virtual ICollection<yazi> yazilar get; set; public int yaziid get; set; public class yazi public int id get; set; public string baslik get; set; public string icerik get; set; public virtual kullanici kullanici get; set; public int kullaniciid get; set; public ICollection<kategori> kategoriler get; set; public int kategoriid get; set; Kategori modelinin içine, birden fazla yazı olabileceği için bir tanımlama yapıyoruz, aynı tanımın tersini yazı modeli içinde yapıyoruz. Bu durum sonucunda oluşan tablo yapısı aşağıdaki (Şekil 5) gibi oluyor. Şekil 5 (Oluşan tabloların ilişkisi) Yukarıda ki diyagramda görüldüğü üzere bizim modelimizde belirtmediğimiz kategoriyazis adında bir tablo oluşmuş. Bu tablo n to n ilişkinin varlığı algılanıp otomatik olarak ado.net tarafından oluşturuluyor. İlişkimizin kilidi de bu tablo. 11

ComplexType Şöyle bir senaryo düşünelim, kullanıcımız var ve bu kullanıcının adres bilgileri, profil bilgileri gibi belli başlıklar altında toplanabilen alanları bulunuyor. Bu alanları kümeleyip, daha derli toplu hale getirdiğimiz yaklaşıma complextype diyoruz. Örneğin kod yazarken, kullanıcının adres ile ilgili bir bilgisine ihtiyaç duyduğumuzda adres kümesi içerisinde bu bilgiyi arıyoruz. Diğer türlü olsaydı örneğin 20 alan olsa 20 alan içerisinde aradığımı bulmaya çalışacak zaman kaybedecektik. Bir model üzerinde incelersek olayı daha iyi anlayabiliriz. public class kullanici public kullanici() iletisim = new iletisim(); profil = new profil(); public int id get; set; public int adi get; set; public int eposta get; set; public iletisim iletisim get; set; public profil profil get; set; public class iletisim public string adres get; set; public string sehir get; set; public string sabittelefon get; set; public string ceptelefon get; set; public string faks get; set; public class profil public string arkaplanrengi get; set; public string arkaplanresmi get; set; public string fontrengi get; set; public string avatar get; set; Kullanıcı modeline baktığımızda 3 modelmiş gibi görünüyor fakat iletişim ve profil sınıfları kümelediğimiz bilgileri tutmamıza olanak sağlıyor. Yani bizim complextype larımız bunlar ;) Bu modelden oluşan tablo aşağıdaki (Şekil 6) gibi oluyor. Görüldüğü üzere alanlar complextype adını ön ek olarak almışlar (iletişim_adres) bunun sebebi farklı kümelerde aynı alan adlarının oluşturacağı karışıklığı ve hataları önlemek. 12

Şekil 6 (ComplexType) Kod yazarken bize sağladığı faydayı aşağıdaki resimde (Şekil 7) görebiliriz. Şekil 7 (ComplexType Avantajı) Eğer ComplexType kullanmasaydık, hangi bilginin nerede olduğunu arayacaktık fakat bu şekilde hangi bilgi nerde olabiliri rahatlıkla anlayıp, bilgiye hemen ulaşabiliyoruz. Onlarca alana sahip bir modelde bu yöntemin işimizi bir hayli kolaylaştırdığını rahatlıkla söyleyebiliriz. 13

Ado.Net Fluent Api Fluent Api 9 en kaba tabirle kod tarafıyla sql tarafında ki mapping işlemlerini düzenlememize olanak sağyalan bir api. Örneğin model sınıfımızdaki bir alanın adı adi iken veritabanında bunun name olması gerekebilir yada kurduğumuz bir ilişkinin adının değişmesi gerekebilir. Bu ve benzeri düzenlemeleri fluent api sayesinde gerçekleştiriyoruz. Modelimiz üzerinde fluent api kullanımına bakacak olursak; [Table("user")] public class kullanici [Key] public int id get; set; [Column("name")] public string adi get; set; public string soyadi get; set; public string eposta get; set; public string sifre get; set; public DateTime kayitzamani get; set; Bu durumda veritabanında oluşan tablonun adı user, modelde adi olan alanın name olarak oluştuğunu görebiliriz. Fluent Api esas olarak context içine yazacağımız OnModelCreating methodunun içinde kullanılıyor, burada ki amaç model oluşturulurken yapılacak işlemlerin tek bir yerde toplanması. Yukarıda ki örneği şimdide context içinde gerçekleştirelim. public class adonetkitapcontext : DbContext public DbSet<kullanici> kullanicis get; set; protected override void OnModelCreating(DbModelBuilder modelbuilder) modelbuilder.entity<kullanici>().totable("user"); modelbuilder.entity<kullanici>().property(x => x.adi).hascolumnname("name"); Fluent apiyi elimizden geldiğince yaymadan context içinde kullanmamızda fayda var. Sebebi ise bu işlemlerin tek bir çatı altında toplanması ve bir problem yada güncelleme olacağı zaman değişikliklerin buradan yapılacak olması. 9 Fluent Api örneklerine http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-apisamples.aspx adresinden bakabilirsiniz. 14

İ puçları Where var result1 = context.kullanicis.where(x=>x.id > 5); var result2 = context.kullanicis.where(x => x.id > 10 && x.adi == "ahmet"); var result3 = context.kullanicis.where(x => x.adi.contains("ahmet")); result1 bildiğimiz where işlemi, id si 5 den büyük kayıtları getiriyor. result2 yine bildiğimiz where işlemi, id si 10 dan büyük adi ahmet olan kayıtları getiriyor. result3 İçinde ahmet geçen kayıtları listeliyoruz. Contains ile veritabanında arama işlemini yapıyoruz, yani sql deki like ın işini yapıyor. Select var result6 = context.kullanicis.select(x => new ID = x.id, ADI = x.adi ); Bazı durumlarda modelimizdeki tüm alanlara ihtiyaç duymayız, select ile istediğimiz alanları belirtebiliyoruz. Yukarıda ki işlemin sql de ki karşılığı; select id as ID, adi as ADI from kullanicis OrderBy var result4 = context.kullanicis.orderbydescending(x => x.id); var result5 = context.kullanicis.orderby(x => x.id).thenbydescending(x=>x.kayitzamani); result4 de id si büyükten küçüğe doğru listeliyoruz. Eğer direk OrderBy (x => x.id); deseydik id si küçükten büyüğe doğru sıralanacaktı. result5 burada ise id si küçükten büyüğe ve kayitzamani büyükten küçüğe doğru sıralama işlemini yapıyoruz. Top, Max, Min var result7 = context.kullanicis.take(10); var result9 = context.kullanicis.max(x => x.id); var result10 = context.kullanicis.min(x => x.id); result7 10 kaydı listeler. context.kullanicis.orderbydescending(x => x.id).take(10); şeklinde ise en son girilen 10 kaydı listeleyebiliriz. result9 en büyük id değerini döndürür. result10 en küçük id değerini döndürür. 15

SqlQuery, ExecuteSqlCommand var result8 = context.database.sqlquery<kullanici>("select * from kullanici"); context.database.executesqlcommand("update from kullanici set adi = 'test' "); result8 de kendi sql sorgumuzu direk yazıp kullanabiliyoruz, burada dikkat edilecek husus veritabanından dönen alanların türleri ve isimleri yüklenecek sınıftakilerle birebir aynı olmalıdır. Bu yöntemi veritabanında ki bir view dan kayıtları çekmek için kullanabiliriz. Direk sql komutu çalıştırmak için ExeCuteSqlCommand özelliğini kullanabiliyoruz. Bu özellik bazı durumlarda hayati önem taşıyabiliyor. Son So z Ado.Net Entity her yeni versiyonda biraz daha iyileştirilen bir orm aracı. Özellikle web uygulaması geliştirirken MVC3 ile birlikte bize sunduğu kolaylıklar göz ardı edilecek gibi değil, günlüğümde Mvc3 ile birlikte nasıl kullanıldığına dair bilgileri bulabilirsiniz. Umarım yararlı bir doküman olmuştur. Gelen istekler doğrultusunda bu dokümanı güncellemeye çalışacağım. Tüm güzellikler sizinle olsun. Abdullah UĞRAŞKAN Web Developer apostylee.com twitter.com/apostylee 16