Entity Framework - การสืบทอด

การสืบทอดทำให้สามารถสร้างแบบจำลองที่ซับซ้อนซึ่งสะท้อนวิธีคิดของนักพัฒนาได้ดีขึ้นและยังลดงานที่ต้องใช้ในการโต้ตอบกับโมเดลเหล่านั้น การสืบทอดที่ใช้กับเอนทิตีมีจุดประสงค์เดียวกับการสืบทอดที่ใช้กับคลาสดังนั้นนักพัฒนาจึงทราบพื้นฐานของการทำงานของคุณลักษณะนี้อยู่แล้ว

ลองดูตัวอย่างต่อไปนี้และโดยการสร้างโครงการแอปพลิเคชันคอนโซลใหม่

Step 1 - เพิ่ม ADO.NET Entity Data Model โดยคลิกขวาที่ชื่อโปรเจ็กต์แล้วเลือกเพิ่ม→รายการใหม่ ...

Step 2 - เพิ่มเอนทิตีหนึ่งรายการและตั้งชื่อเป็นบุคคลโดยทำตามขั้นตอนทั้งหมดที่กล่าวถึงในบทแนวทางแรกของโมเดล

Step 3 - เพิ่มคุณสมบัติสเกลาร์ตามที่แสดงในภาพต่อไปนี้

Step 4 - เราจะเพิ่มอีกสองเอนทิตี Student และ Teacherซึ่งจะสืบทอดคุณสมบัติจาก Person Table

Step 5 - ตอนนี้เพิ่มเอนทิตีนักเรียนและเลือกบุคคลจากคอมโบบ็อกซ์ประเภทพื้นฐานดังที่แสดงในภาพต่อไปนี้

Step 6 - เพิ่มเอนทิตีครูในทำนองเดียวกัน

Step 7 - ตอนนี้เพิ่มคุณสมบัติสเกลาร์ EnrollmentDate ให้กับเอนทิตีนักเรียนและคุณสมบัติ HireDate ไปยังเอนทิตีครู

Step 8 - มาสร้างฐานข้อมูลกันเลย

Step 9 - คลิกขวาที่พื้นผิวการออกแบบและเลือกสร้างฐานข้อมูลจากแบบจำลอง ...

Step 10- หากต้องการสร้างฐานข้อมูลใหม่ให้คลิกที่การเชื่อมต่อใหม่ ... กล่องโต้ตอบต่อไปนี้จะเปิดขึ้น คลิกตกลง

Step 11- คลิกเสร็จสิ้น สิ่งนี้จะเพิ่มไฟล์ * .edmx.sql ในโปรเจ็กต์ คุณสามารถเรียกใช้สคริปต์ DDL ใน Visual Studio ได้โดยเปิดไฟล์. sql ตอนนี้คลิกขวาและเลือกดำเนินการ

Step 12 - ไปที่เซิร์ฟเวอร์ explorer คุณจะเห็นว่าฐานข้อมูลถูกสร้างขึ้นด้วยตารางสามตารางที่ระบุไว้

Step 13 - คุณยังสามารถดูว่าคลาสโดเมนต่อไปนี้ถูกสร้างขึ้นโดยอัตโนมัติ

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; }
}

ต่อไปนี้เป็นคลาสบริบท

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; }
}

มาเพิ่มนักเรียนและครูบางส่วนในฐานข้อมูลแล้วดึงข้อมูลจากฐานข้อมูล

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();
      }
   }
}

มีการเพิ่มนักเรียนและครูในฐานข้อมูล NT เพื่อดึงข้อมูลนักเรียนและครูไฟล์OfType ต้องใช้วิธีการซึ่งจะส่งคืน Student และ Teacher ที่เกี่ยวข้องกับแผนกที่ระบุ

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();

ในแบบสอบถามแรกเมื่อคุณใช้ OfType <Student> () คุณจะไม่สามารถเข้าถึง HireDate ได้เนื่องจากคุณสมบัติ HireDate เป็นส่วนหนึ่งของ Teacher Entity และคุณสมบัติ EnrollmentDate ในทำนองเดียวกันจะไม่สามารถเข้าถึงได้เมื่อคุณใช้ OfType <Teacher> ()

เมื่อดำเนินการโค้ดด้านบนคุณจะได้รับผลลัพธ์ต่อไปนี้ -

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
*****************************************************************

เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น