4 Mayıs 2014 Pazar

Entity Framework Kalıtım (Inheritance)


   Merhaba Arkadaşlar,

   Geçen hafta Lazy Loading konusunu işledikten sonra bu hafta daha fazla ilginizi çekeceğini düşündüğüm bir konu olan Entity Framework Kalıtım konusuna değineceğim. Entity Framework Kalıtım konusunu iki temel başlık altında inceleyebiliriz. Bunlardan ilki TPH yani Table-per-Hierarchy diğeri ise TPT yani Table-per-Type' dır.

   Table-per-Hierarchy Inheritance:
   TPH kalıtımı esasen bir tablo üzerinden yapılan kalıtımdır. Daha fazla açıklamak gerekirse veritabanımızda bir tablomuz var. Fakat bu tablo birden fazla Entity model tutuyor. İşte bu şekilde yapılan kalıtım TPH olarak adlandırılır.

   Table-per-Type Inheritance:
   TPT kalıtım ise TPH kalıtımın tam tersi desek pek de yanlış olmaz. Bunda ise veritabanımızda birden fazla one-to-one ilişki içerisinde bulunan tablo var fakat bu tabloların hepside tek bir Entity model şeklinde tutuluyor ise TPT olarak adlandırılır.

   Bu yazımda TPH kalıtımı yolunu nasıl projelerimizde kullanabileceğimizi anlatmaya çalışacağım. Her yazımda olduğu gibi bu yazımda da farklı bir veritabanı oluşturup, oluşturduğumuz bu veritabanını kullanarak işlemleri gerçekleştireceğim. İlk önce veritabanımızı oluşturmak için gerekli Sql Query'i yazalım. Aşağıdaki Query kullanarak sizde kendi veritabanınızı oluşturabilirsiniz.

create database EFInheritance

use EFInheritance

create table Users(
Id int NOT NULL IDENTITY(1,1),
Name varchar(50),
Email varchar(150),
primary key (Id),
)

create table Students(
Id int NOT NULL IDENTITY(1,1),
Major varchar(50),
primary key (Id),
)

create table Employees(
Id int NOT NULL IDENTITY(1,1),
Salary int,
primary key (Id),
)

create table PrintedDocument(
Id int NOT NULL IDENTITY(1,1),
Title varchar(50),
Subject varchar(50),
TypeCode int,
Author varchar(100),
Frequency varchar(50),
primary key(Id),
)

   Veritabanımızı oluşturduktan sonra yeni bir C# Console Application projesi oluşturuyoruz. Oluşturduğumuz projeye hazırladığımız veritabanının modelini ekliyoruz. Modelimizi ekledikten sonra aşağıdaki adımları sırasıyla uyguluyoruz.

   1- User Tablosu ile Student Tablosu Arasında Kalıtım Oluşturma
    User tablosu ile Student tablosu arasında inheritance oluşturmak için User tablosuna Sağ Tık -> Add New -> Inheritance... yi seçiyoruz.

Figür 1-Inheritance Ekleme
  
Karşımıza gelen ekrandan Select a base Entity kısmına User Select a derived kısmına Student seçiyoruz.

Figür 2-User Student Kalıtım

   2- User Tablosu ile Employee Tablosu Arasında Kalıtım Oluşturma
   1. adımda yaptığımız işlemi tekrarlıyoruz. Figür 2' de gösterilen işlemi Employee tablosu için de uyguluyoruz. 
Figür 3- Employee User Kalıtım

   3-Yeni Entity Oluşturup PrintedDocument Tablosuna Bağlama
   Yukarıdaki adımları tamamladıktan sonra PrintedDocument tablosuna bağlamak üzere iki farklı Entity oluşturacağız. Bunun için ilk önce bulunduğumuz sayfaya Sağ Tık -> Add New -> Entity... seçeneğini seçiyoruz.

Figür 4- Entity Ekleme
      Daha sonra karşımıza aşağıdaki gibi bir pencere açılacaktır. Açılan pencerede Entity name kısmına Book Base type kısmını ise PrintedDocument olarak seçip işlemi tamamlıyoruz.

Figür 5- Book Entity Ekleme

   4- Journal Entity Oluşturup PrintedDocument'e Bağlama
   Yukarıdaki basamakta gerçekleştirdiğimiz işlemleri bu adımda da yineliyoruz. Karşımıza çıkan pencereyi aşağıdaki ekran görüntüsü gibi dolduruyoruz.

Figür 6- Journal Entity Oluşturma
   5-Oluşturulan Entitylerin Mapping Tablosunu Düzenleme
   Oluşturduğumuz Entitylerin Mapping Tablosunu düzenlemek için herhangi bir Entity'e Sağ Tık-> Table Mapping seçeneğini seçiyoruz.

Figür 7-Table Mapping

   6- Entitylerin Table Mapping Atamaları
   Sağ Tık-> Table Mapping seçeniğine tıkladıktan sonra Book için şu işlemleri yapmamız gerekecek. İlk olarak Map kısmında PrintedDocumen kısmını çekiyoruz. Daha sonra Condition kısmında ise TypeCode seçtikten sonra karşısına "1" yazıyoruz. 

Figür 8-Book Mapping 

   7-Journal Table Mapping Atamaları
   Yukarıdaki işlemleri Journal Entity içinde tekrarlıyoruz fakat bu sefer Condition kısmına "2" yazıyoruz.

Figür 9 -Journal Mapping
   8-PrintedDocument Property Düzenleme
   Entityleri PrintedDocument tablosuna bağladıktan sonra PrintedDocument'in Abstract propertysini True yapıyoruz.

Figür 10- Abstract True


   9-İşlemleri Onaylama (Validate)
   Yaptığımız tüm bu işlemleri onaylamak için Sağ Tık -> Validate seçeneğine tıklıyoruz.
   
   
Figür 11-Validate

   Data Modellerimizin son görüntüsü aşağıdaki gibi olması beklenir.
Figür 12- Son Görünüm

   Bütün bu işlemleri gerçekleştirdikten sonra artık CRUD işlemlerini gerçekleştirebiliriz.

   Yeni bir öğrenci oluşturmak için aşağıdaki kodu kullanabilirsiniz.

using (var ae= new EFInheritanceEntities()){

   //Create
   var student = new Student(){
       Name = "Hürkan Seyhan",
       Email = "hurkanseyhan@gmail.com",
       Major = "Computer Engineer",
   };
   ae.Users.AddObject(student);

}

   Görüldüğü gibi "Name" ve "Email" attributesini Student tablosunda olmadığı halde onu sanki Student tablosu attributesi gibi kullanabildik ve en sonunda da User tablosunada oluşturduğumuz bu student objesini ekleyebildik.

   Yeni bir employee eklemek istersek;

   //Create
   var employee = new Employee(){
       Name = Ahmet Hamdi",
       Email = "ahamdi@gmail.com",
       Salary = 3500,
   };
   ae.Users.AddObject(employee);

ae.SaveChanger(); // Yapılan değişiklikleri veritabanına bildirmek için.

   Eğer oluşturduğumuz Student'ı silmek istersek;

   var hurkan = ae.Users.ofType<Student>()
                .Single(o=>o.Name="Hurkan Seyhan")
 ae.Users.Delete(Object(hurkan));
 ae.SavaChanges();

   Bu kodda da User tablosu üzerinde bulunan tipi Student olan bir nesneyi nasıl sileceğimizi görmüş olduk.

   Bugünkü yazımı burada sonlandırıyorum. PrinterDocument tablosu ile işlemleri sonraki haftalarda anlatmaya çalışacağım. Umarım faydalı bir yazı olmuştur. 

   Takipte kalmanız dileğiyle...

   Referanslar

Hiç yorum yok:

Yorum Gönder