Entity Framework - Devralma

Kalıtım, geliştiricilerin nasıl düşündüğünü daha iyi yansıtan ve aynı zamanda bu modellerle etkileşim için gereken işi azaltan karmaşık modeller oluşturmayı mümkün kılar. Varlıklarla kullanılan kalıtım, sınıflarda kullanılan kalıtımla aynı amaca hizmet eder, bu nedenle geliştiriciler bu özelliğin nasıl çalıştığına dair temel bilgileri zaten bilirler.

Aşağıdaki örneğe bir göz atalım ve yeni bir konsol uygulama projesi oluşturalım.

Step 1 - Proje adına sağ tıklayarak ADO.NET Varlık Veri Modeli ekleyin ve Ekle → Yeni Öğe… öğesini seçin.

Step 2 - Bir varlık ekleyin ve Model First yaklaşımı bölümünde bahsedilen tüm adımları izleyerek Kişi olarak adlandırın.

Step 3 - Aşağıdaki resimde gösterildiği gibi bazı skaler özellikler ekleyin.

Step 4 - İki varlık daha ekleyeceğiz Student ve Teacher, özellikleri Kişi Tablosundan devralır.

Step 5 - Şimdi Öğrenci varlığını ekleyin ve aşağıdaki görüntüde gösterildiği gibi Temel türü birleşik giriş kutusundan Kişi'yi seçin.

Step 6 - Benzer şekilde Öğretmen varlığını ekleyin.

Step 7 - Şimdi öğrenci varlığına EnrollmentDate skalar özelliğini ve Öğretmen varlığına HireDate özelliğini ekleyin.

Step 8 - Devam edelim ve veritabanını oluşturalım.

Step 9 - Tasarım yüzeyine sağ tıklayın ve Modelden Veritabanı Oluştur'u seçin ...

Step 10- Yeni Veritabanı oluşturmak için Yeni Bağlantı'ya tıklayın… Aşağıdaki iletişim kutusu açılacaktır. Tamam'ı tıklayın.

Step 11- Bitir'i tıklayın. Bu, projeye * .edmx.sql dosyasını ekleyecektir. .Sql dosyasını açarak DDL betiklerini Visual Studio'da çalıştırabilirsiniz. Şimdi sağ tıklayın ve Yürüt'ü seçin.

Step 12 - Sunucu gezginine gidin, veritabanının belirtilen üç tabloyla oluşturulduğunu göreceksiniz.

Step 13 - Aşağıdaki alan sınıflarının da otomatik olarak oluşturulduğunu görebilirsiniz.

public partial class Person {
   public int ID { get; set; }
   public string FirstMidName { get; set; }
   public string LastName { get; set; }
}

public partial class Student : Person {
   public System.DateTime EnrollmentDate { get; set; }
}

public partial class Teacher : Person {
   public System.DateTime HireDate { get; set; }
}

Bağlam sınıfı aşağıdadır.

public partial class InheritanceModelContainer : DbContext {

   public InheritanceModelContainer() : 
      base("name = InheritanceModelContainer") {}

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      throw new UnintentionalCodeFirstException();
   }

   public virtual DbSet<Person> People { get; set; }
}

Veritabanına bazı Öğrenci ve Öğretmenleri ekleyip ardından veritabanından alalım.

class Program {

   static void Main(string[] args) {

      using (var context = new InheritanceModelContainer()) {

         var student = new Student {
            FirstMidName = "Meredith", 
            LastName = "Alonso", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(student);

         var student1 = new Student {
            FirstMidName = "Arturo", 
            LastName = "Anand", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(student1);

         var techaer = new Teacher {
            FirstMidName = "Peggy", 
            LastName = "Justice", 
            HireDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(techaer);

         var techaer1 = new Teacher {
            FirstMidName = "Yan", 
            LastName = "Li", 
            HireDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(techaer1);
         context.SaveChanges();
      }
   }
}

Veritabanına öğrenciler ve öğretmenler eklenir. NT Öğrencileri ve öğretmeni geri almak,OfType Belirtilen bölümle ilgili Öğrenci ve Öğretmeni döndürecek yöntemin kullanılması gerekir.

Console.WriteLine("All students in database"); 
Console.WriteLine("");

foreach (var student in context.People.OfType<Student>()) {
   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ", 
      student.ID, name, student.EnrollmentDate.ToString());
}

Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.WriteLine("");
Console.WriteLine("All teachers in database");
Console.WriteLine("");

foreach (var teacher in context.People.OfType<Teacher>()) {
   string name = teacher.FirstMidName + " " + teacher.LastName;
   Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ", 
      teacher.ID, name, teacher.HireDate.ToString()); 
}

Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.ReadKey();

İlk sorguda, OfType <Student> () kullandığınızda HireDate'e erişemezsiniz çünkü HireDate özelliği Teacher Entity'nin bir parçasıdır ve benzer şekilde EnrollmentDate özelliği OfType <Teacher> () kullandığınızda erişilemez.

Yukarıdaki kod çalıştırıldığında, aşağıdaki çıktıyı alacaksınız -

All students in database
ID: 1, Name: Meredith Alonso,   Enrollment Date 10/30/2015 12:00:00 AM
ID: 2, Name: Arturo Anand,      Enrollment Date 10/30/2015 12:00:00 AM
*****************************************************************  
All teachers in database
ID: 3, Name: Peggy Justice,     HireDate 10/30/2015 12:00:00 AM
ID: 4, Name: Yan Li,    HireDate 10/30/2015 12:00:00 AM
*****************************************************************

Daha iyi anlamak için yukarıdaki örneği adım adım uygulamanızı öneririz.