Sorularla Nesne Tabanlı Programlama (OOP) – 3

Sorularla nesne tabanlı programlama yazı serime devam ediyorum. Serinin ilk yazısını okumak için buraya tıklayabilirsiniz.

ORM nedir?

ORM (Object Relational Mapping), bir ilişkisel veritabanıyla nesneyi bağlamak için metadata (veri hakkında veri / üst bilgi) tanımlayan bir programlama tekniğidir.

Çok önemli bir terimdir, çünkü bu terimden yola çıkarak bir yandan Entity Framework‘e geçiş yapmış olacağız. Gerçi şimdiye kadar bahsettiğim birçok şey yine entity framework içine giriyor. Entity Framework ne demek diye düşünmeyin yazının devamında ona da değineceğim fakat öncelikle bunları bilmeliyiz.

Nesne yani kod, Java ve C# gibi nesne yönelimli programlama (OOP) dillerinde yazılır. ORM, ilişkisel veritabanı ve OOP arasındaki veri dönüşümünü gerçekleştirir. En basit şekilde açıklamak gerekirse; ORM, yazılım ile veritabanı arasında bir köprü görevi görür.

ORM ne iş yapar? Nasıl çalışır?

ORM, veritabanındaki tabloları sınıflara (class) çevirir. ORM sayesinde kod yazarken veritabanında daha az zaman harcarız. ORM, veri kaynağı değiştiğinde onu kapsüller (encapsulates) ve gizler.

Encapsulation nedir?

Encapsulation (saklama, paketleme), soyutlamayı desteklemek ya da güçlendirmek için bir sınıfın iç yapısının gizlenmesidir. Bu şekilde veriler fonksiyonlara gizlenebilir. Nesnenin içindeki kod, veri veya her ikisi bu nesneye private (özel) veya public (genel) olabilir.

SQL nedir?

Buraya kadar gelmişseniz mutlaka sql’i duymuş ve ne olduğunu biliyorsunuzdur zaten fakat bir sonraki soru için SQL ne demek tekrardan hatırlamakta fayda var.

SQL, verileri yönetmek ve tasarlamak için kullanılan bir veritabanı yönetim sistemidir. Kendisi bir programlama dili olmamasına rağmen birçok kişi tarafından programlama dili olarak bilinir.

Basite indirecek olursak; SQL, veritabanı işlemlerini gerçekleştirmek için kullanılan bir sorgu dilidir.

Çok kullanılan veritabanı sistemleri nelerdir?

En yayın kullanılan veritabanları MS Sql Server (MSSQL), AccessOracle ve Mysql‘dir.

ADO.NET nedir? Nerede kullanırız?

ADO.NET (ActiveX Data Object .NET), Microsoft tarafından bize sunulan, veritabanı ile uygulamalarımız arasında köprü görevini görmektedir.

ADO.NET ile uygulama tarafında veritabanına bağlanabilir, verileri listeyebilir, güncelleyebilir, veri ekleyebilir veya silebiliriz. Yani, SQL sorgularını uygulama tarafında kullanabiliriz.

ADO.NET’te veri çekmenin 2 yolu var: connected ve disconnected mimarisi.

Connected ve Disconnected Mimarileri nedir? Nasıl çalışır?

• Connected Mimari: Bu mimaride veritabanından veri çekme süresi boyunca uygulama veritabanına bağlı kalır ve bilgiler bağlı kalma süresi boyunca çekilebilir. Veri çekmek için veritabanına sürekli bağlı kalması zorunluluğundan dolayı sql server sürekli meşgul olur ve bu bir dezavantajdır. Avantajı ise, disconnected mimariye göre verileri daha hızlı çeker.

• Disconnected Mimari: Bu mimaride uygulama sql’e bağlı kalmadan veriler çekilir. Bunun için SqlDataAdapter kullanılır. Disconnected mimaride SqlDataAdapter nesnesi oluşturulur ve bu aracı nesne sayesinde veritabanından veri çekilir. Bütün bağlantılar bunun üzerinden yapılır. Bu mimaride bağlantı açıp kapamanıza gerek yoktur, SqlDataAdapter bağlantıyı kendisi açıp kapatır.

LINQ nedir?

LINQ (Language Integrated Query), nesneler üzerinde bulunan ilişkisel veriyi hızlı bir şekilde sorgulamak için kullanılan sorgulama aracıdır.

“Linq to Sql” nedir?

Linq alt yapısının sql veritabanı üzerine uyarlanmış halidir.

Linq teknolojisi nedir? Ne işe yarar?

Platform farklılıklarından kaynaklanan sorunların kaldırılması için geliştirilmiştir. Linq ile sorguları nesnel ifadelerle hazırlayabiliriz. Linq, programcı açısından ADO.NET ile uzun uzun kod yazmaya son verir ve veriye kolayca erişebilmeyi sağlar.

ADO.NET yapısı kullanıldığında hatalar çalışma zamanında ortaya çıkar, Linq ile yapıldığında ise hatalar derleme aşamasında çıkar.

ADO.NET‘te veri çekmek için connectionstring, sqlcommand, bağlantıyı açma kapama gibi işlemler yapmak zorundayız. Linq‘te değişiklik neredeyse hiç yapılmamakta ve veritabanına ulaşırken bağlantının açık kapalı olmasını kontrol etmeye gerek kalmıyor.

Entity Framework (EF) nedir?

Entity Framework (EF), .Net platformunda ORM araçlarından biridir. Yani Entity Framework, nesne tabanlı programlamada veritabanındaki tablolara uygun nesneler oluşturma tekniğidir.

Entity Framework kodlama olarak bize zaman kazandırır (ORM tanımında da değinmiştik zaten bu konuya). Ayrıca veritabanı olarak esnek yapıya sahiptir. Örneğin yazdığınız proje MSSQL ile çalışmakta ve birden Oracle’a geçmeniz istendi. Bunu yapabilmek için birçok ayar gerekirken Entity Framework ile direkt geçiş yapabilirsiniz.

EF‘de veritabanı bağımlılığı yoktur. Yani EF’yi oluşturmadan önce veritabanı tablo ve kolonlarını oluşturmalısınız gibi bir kural yoktur. Siz EF ile modellemeyi yaparken olmayan tabloları ve kolonları sizin yerinize açacaktır.

Bize birçok yarar sağlamasına karşın performans olarak ADO.NET kadar hızlı değildir. Yani yazılan her proje entity ile olmak zorunda değildir ve/veya projenin tamamında entity kullanmak sizin için dezavantaj olabilir.

Entity Framework ile 4 farklı yöntem ile proje geliştirilebilir. Bu yöntemler;

  • Model First (Önce Model): Bu yöntemde Visual Studio üzerinde boş bir model dosyası (.edmx) eklenerek veritabanı bu model üzerinde tasarlanır. Derleme adımında verilen script dosyası ile veritabanı oluşturulur.
  • Database First (Önce Veritabanı): Bu yöntemde hali hazırda var olan veritabanı projeye model dosyası ile bağlanır ve gerekli class’lar EF tarafından üretilir.
  • Code First (Önce Kod – Yeni Veritabanı): Bu yöntemde classlar ve mapping kodları yazılımcı tarafından oluşturulur. Daha sonra veritabanı bu class’lardan türetilir.
  • Code First (Önce Kod – Var olan Veritabanı): Bu yöntemde de classlar ve mapping kodları yazılımcı tarafından oluşturulur. Veritabanı class’ların ve modellemenin durumuna göre tekrardan şekillenebilir.

Lazy Loading ve Eager Loading nedir?

ADO.NET‘teki connected ve disconnected mimarilerini az önce açıklamıştık. Lazy Loading ve Eager Loading yapılarını da entity içerisindeki connected ve disconnected mimari gibi düşünebilirsiniz.

Lazy Loading‘de daha çok sql çalışır bu nedenle daha yavaştır. Eager Loading‘de ise Lazy’ye göre daha az sql çalıştığından daha hızlıdır. Eager Loading yapmak için sadece kod kısmında lazy loading’i false yani pasif yapmanız yeterlidir. Aşağıdaki kod örneklerinden kullanımı daha iyi anlayabilirsiniz.

  • Lazy Loading için kod kullanımı:
private static void GetProductInfoWithoutInclude()
{
AdventureWorksLT2008Entities db = new AdventureWorksLT2008Entities();
var categories = db.ProductCategory
.ToList();
 
categories.ForEach(p =>
{
Console.WriteLine(string.Format("{0} [{1}]", p.Name, p.Product.Count));
});
}
  • Eager Loading için kod kullanımı:
private static void GetProductInfoWithInclude()
{
AdventureWorksLT2008Entities db = new AdventureWorksLT2008Entities();
 
db.Configuration.LazyLoadingEnabled = false;
var categories = db.ProductCategory
.Include("Product")
.ToList();
 
categories.ForEach(p =>
{
Console.WriteLine(string.Format("{0} [{1}]", p.Name, p.Product.Count));
});
}

 

SQL Injection nedir?

Veritabanına dayalı uygulamalarda saldırmak için kullanılan bir atak tekniğidir. Bir blog yazarının tabiriyle açıklamak gerekirse, “SQL’in içine zehir enjekte edilmesidir” diyebiliriz. Burada saldırgan SQL dili özelliklerinden faydalanarak standart uygulama ekranındaki ilgili alana yeni SQL ifadelerini ekler. Örneğin saldırgan, veritabanı içeriğini kendisine aktarabilir.

Basit bir uygulama ile nasıl yapıldığını anlayalım.

SQL injection nasıl yapılır?

Diyelim ki SQL kullanan bir siteye kullanıcı adı user ve şifre 123 olarak giriş yapıyorsunuz. Giriş butonuna tıkladığınız anda sitenin yazılımı veritabanına aşağıdaki gibi bir sorgu gönderecektir:

SELECT * FROM kullanicilar WHERE isim='user' AND sifre='123'

Yazılım sonuç bulunursa girişinize izin verecek yani sisteme giriş yapacaksınız, bulunamazsa izin vermeyecektir. Bir de kullanıcı adı ve şifre alanına ‘ OR 1=1 — yazdığımızda gönderilecek olan sorguya bakalım:

SELECT * FROM kullanicilar WHERE isim=''OR 1=1 --' AND sifre=''OR 1=1 --'

Yukarıdaki sorgu gönderilecektir. Eğer yazılım girdileri filtreliyorsa SQL injectionu engelleyip girişinize izin vermeyecek, filtrelemiyorsa kullanıcı adı ve şifrenizi doğru zannedip girişe izin verecektir.

‘ OR 1=1 — SQL dilinde her zaman true döndürür (olumlu sonuç döndürür). Bu yüzden SQL programı bütün kayıtları listeleyeceğinden, yazılım doğru giriş yapıldı zannedecektir. ‘ OR 1=1 — ifadesi, önceki koşul gerçekleşmese bile boş ver, 1=1 gerçekleşiyorsa true döndür ve sorgunun geri kalanını boşver  (— yorum anlamına geldiğinden sorgunun kalanı yorummuş gibi algılanır) demektir.

SQL Injection nasıl önlenir?

Entity Framework kullanarak Linq kodlar yazarsanız, uygulama içerisinde yukarıdaki gibi sql kodlar yazmayacağınız için sql injection atağını engelleyebilirsiniz.

Eğer illa ki sql yazacaksanız, bunu önlemek için de alınan her veride ‘ ve ” karakterleri getirilerek korunulur. Bu karakterler ya karakter koduna çevrilmeli ya da başına \ yani kaçırma karakteri eklenmelidir. Bu durumda SQL programı o karakterleri komut olarak algılamayacaktır.

 

Bu yazımızın da sonuna geldik. Serinin son yazısı olabilir belki, şu an kestiremiyorum fakat bundan sonraki gelecek sorularım yine bu yönde olursa devam edebilirim. Ayrıca 3 yazılık bu serinin asıl amacı nesne tabanlı programlamayı iyi anlamak ve entity framework‘e giriş yapmaktı. Bundan sonraki yazı entity framework hakkında detay bilgi içeren bir şey olabilir belki, bakalım. Çok “belki”li konuştuğumun farkındayım, bunun sebebi ne zaman ne yayınlayacağımı bilemiyorum açıkçası. Blog’a girip “yeni yazı ekle”ye tıklıyorum ve o an aklıma gelen şeyleri yazıyorum.

Öyleyse bir sonraki bilinmeyen yazıda görüşmek üzere! 🙂

 

Bir yorum ekleyin

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir