.NET uygulamalarımızın hemen hemen hepsinde bir veri tabanı söz konusudur. Veri tabanı ile yapılan işleri barındıran sınıflar ADO.NET çatısı altında yer alır. Entity Framework, ADO.NET çatısı altında yer alan bir ORM (Object Relational Mapping) aracıdır. ORM araçlarında temel mantık, adından da anlaşılabildiği gibi veri tabanındaki tablolara karşılık entity sınıfların oluşturulması, tablolardaki her bir kolona karşılık ilgili propertylerin oluşturulması ve gerekli ilişkilerin kurulmasıdır. Yani bir eşleme işlemi söz konusudur. “X sınıfı, Y veri tabanındaki Z tablosunu temsil eder” şeklinde bir yaklaşım sergileyebiliriz. Bu makalemizde, SQL server üzerindeki bir veri tabanını uygulamamıza nasıl dahil edeceğimizi göreceğiz.

AdventureWorks veri tabanında yer alan Production.Product, Production.ProductSubcategory ve Production. ProductCategory tablolarını uygulamamıza dahil etmeye çalışacağız. Bu işlemi ORM aracı kullanmadan yapmak istersek ilk olarak ilgili entiy sınıflarını, yani her bir tabloya karşılık gelecek olan sınıfları yazmamız gerekir. Bir sonraki adım, tablolardaki her bir kolon için, entity sınıflarına ilgili property’lerin tanımlanmasıdır. Tablolar arasındaki ilişkiler de koleksiyon vb yapılar yardımı ile belirtilir. Daha sonra da veri tabanı üzerinde ilgili işlemleri yapan (bağlantı oluştur, sorgu çalıştır vb) bir sınıf yazılır. İşte bahsettiğimiz tüm bu adımları Entity Framework bizim yerimize gerçekleştirecektir.

Basit bir console uygulaması açalım. Amacımız, Production.Product tablosundaki her bir ürününün adını, alt kategori adını ve kategori adını ekrana yazdırmak olsun. Bu işlemi entity framework kullanarak gerçekleştireceğiz. Projemize sağ tuş tıklayarak “Add” sekmesinden “New Item”ı seçelim. Sağ üst köşedeki arama kısmına “ADO” yazarak “ADO.NET Entity Data Model”I seçelim. Ben modelime “AdventureWorksModel” adını verdim. Hangi veri tabanını temsil ettiğini görebilmemiz açısından isimlendirmeye dikkat edilmesini öneririm.

image

Modelimizi ekledikten sonra karşımıza “Entity Data Model Wizard” ekranı gelecek. Varolan bir veri tabanını modellediğimiz için “Generate from database”I seçelim ve next diyelim. Model-First yaklaşımında ise ilgili modeli burada tasarlayıp, sql server üzerinde veri tabanının ve tabloların otomatik olarak oluşturulmasını sağlayabiliriz. Bunu ilerleyen zamanlarda ele alacağım.

image

Bir sonraki adımda ilgili bağlantı bilgisinin oluşması için server’ı ve hangi veri tabanını kullanmak istediğimizi belirteceğimiz ekran ile karşılaşacağız. “New Connection”ı tıklayalım ve bu bilgileri belirtelim.

image

Yukarıdaki ekran yerine “Change Data Source” ekranı ile karşılaşanlar “Microsoft SQL Server” seçeneğini tıklayarak devam edebilirler.

Benim kullandığım server Express sürümü olduğundan Server Name kısmına .\SQLEXPRESS yazdım. Express sürümü kullanmayanlar sadece  . veya pc’nin adını  yazabilirler. Daha sonra da Connect to a database kısmında modelini oluşturmak istediğimiz veri tabanını seçelim. Bu örneğimiz için AdventureWorks’ü seçiyor olacağım. Sol altta yer alan “Test Connection” butonuna tıklayarak girilen bilgilerin doğru olup olmadığı kontrol edilebilir.

image

İlgili connection string’in oluşturulduğunu görüyoruz. Bu bilgi uygulamaya dahil edilen app.config dosyası içerisinde yer alacaktır. Eğer sql authentication seçilmiş olsaydı, yani connection string içerisinde UserID ve password geçseydi, güvenlik riski taşındığından ötürü bu bilgilerin ayrı bi yerde tutulabilmesi sağlanabilirdi. Yukarıda connection string bilgisinin hemen üzerindeki bölümde bunu ayarlayabilmemiz mümkündür. AdventureWorksEntities adlı sınıf ise veri tabanı ile ilgili işlemleri gerçekleştirecek olan sınıfımızdır.

Daha sonraki ekranda ise ilgili veri tabanı içerisinde istediğimiz tabloları, view’ları ve procedure’leri seçebiliriz. Product,ProductSubcategory, ProductCategory tablolarını seçerek ilerliyor olacağım.

image

Nihayet son adıma geldik. Finish butonuna tıkladıktan sonra modelimizle tanışabiliriz.Smile

image

Proje içerisine eklediğimiz AdventureWorksModel’in designer kısmında ilgili sınıfların oluştuğunu görmemiz mümkündür. Zaten yukarıda da görüldüğü gibi. Product,ProductSubcategory ve ProductCategory adında üç adet sınıf oluşturulmuş durumda. İçerisindeki property’ler, tabloların kolonları ile birebir aynıdır.

Şimdi de program tarafında veri tabanındaki işlemlerimizi gerçekleştirecek olan AdventureWorksEntities adlı sınıfın nesnesini örnekleyerek veri tabanındaki ilk 10 ürünün isimlerini ve bağlı oldukları altkategori ve kategori isimlerini yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            AdventureWorksEntities context = new AdventureWorksEntities();

 

            foreach (var product in context.Product.Where(p => p.ProductSubcategoryID != null).Take(10))

            {

                Console.WriteLine("Ürün Adı:{0}\tAlt Kategori:{1}\tKategori:{2}",

                                    product.Name,

                                    product.ProductSubcategory.Name,

                                    product.ProductSubcategory.ProductCategory.Name);

            }

        }

    }

Dikkat ederseniz, bir product nesnesi üzerinden alt kategori ve kategori bilgilerine direkt olarak erişebiliyoruz. Model üzerinde gördüğümüz gibi, tabolar arasındaki ilişkiler Navigation Property’ler ile sağlanmış durumdadır. Dolayısı ile ilgili ürünün üzerinden “ProductSubcategory” dediğimizde, ürünün ProductSubcategoryID’si ile doğru alt kategoriye gidilmektedir. Aynı şekilde, alt kategoriden kategoriye de ulaşabiliriz. 

Ayrıca, Product tablosundaki ProductSubCategoryID kolonu nullable bir kolondur. Bu sebepten dolayı,  “object reference not set to an instance of an object” şeklinde bir hata almamak için, ProductSubcategoryID’si null olmayan ürünleri sorgu nesnemiz içerisine dahil ettik.

Ekran görüntümüz aşağıdaki gibi olacaktır.

image

Görüldüğü gibi çok kolay bir şekilde veri tabanındaki herhangi bir tabloya erişim sağlayabildik. Klasik yöntemlerde SqlConnection, SqlCommand, SqlDataReader vb nesneler kullanarak yapılan bu işlemleri, extra kod yazmadan basit bir şekilde gerçekleştirebildik.

Bir sonraki makalemizde Entity Framework ile insert, update ve delete işlemlerinin nasıl yapıldığını ele alacağız. Faydalı olması dileği ile…



2 yorum:

Ercan Bozkurt dedi ki...

Eline sağlık

Onur Salkaya dedi ki...

Teşekkür ederim

Yorum Gönder