Khung thực thể - Kế thừa

Tính kế thừa giúp có thể tạo ra các mô hình phức tạp phản ánh tốt hơn cách các nhà phát triển suy nghĩ và cũng giảm bớt công việc cần thiết để tương tác với các mô hình đó. Kế thừa được sử dụng với các thực thể phục vụ cùng mục đích như kế thừa được sử dụng với các lớp, vì vậy các nhà phát triển đã biết những điều cơ bản về cách hoạt động của tính năng này.

Hãy xem ví dụ sau và bằng cách tạo một dự án ứng dụng bảng điều khiển mới.

Step 1 - Thêm Mô hình Dữ liệu Thực thể ADO.NET bằng cách nhấp chuột phải vào tên dự án và chọn Thêm → Mục mới…

Step 2 - Thêm một thực thể và đặt tên là Person bằng cách làm theo tất cả các bước được đề cập trong chương Cách tiếp cận đầu tiên của mô hình.

Step 3 - Thêm một số thuộc tính vô hướng như trong hình sau.

Step 4 - Chúng tôi sẽ thêm hai thực thể nữa StudentTeacher, sẽ kế thừa các thuộc tính từ Bảng Người.

Step 5 - Bây giờ thêm thực thể Sinh viên và chọn Người từ hộp kết hợp Loại cơ sở như thể hiện trong hình sau.

Step 6 - Tương tự thêm thực thể Giáo viên.

Step 7 - Bây giờ thêm thuộc tính vô hướng EnrollmentDate vào thực thể sinh viên và thuộc tính HireDate vào thực thể Giáo viên.

Step 8 - Hãy tiếp tục và tạo cơ sở dữ liệu.

Step 9 - Nhấp chuột phải vào bề mặt thiết kế và chọn Generate Database from Model…

Step 10- Để tạo Cơ sở dữ liệu mới, nhấp vào Kết nối Mới… Hộp thoại sau sẽ mở ra. Bấm OK.

Step 11- Nhấp vào Kết thúc. Điều này sẽ thêm tệp * .edmx.sql trong dự án. Bạn có thể thực thi các tập lệnh DDL trong Visual Studio bằng cách mở tệp .sql. Bây giờ nhấp chuột phải và chọn Execute.

Step 12 - Vào server explorer bạn sẽ thấy cơ sở dữ liệu được tạo với ba bảng được chỉ định.

Step 13 - Bạn cũng có thể thấy rằng các lớp miền sau cũng được tạo tự động.

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

Sau đây là lớp Context.

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

Hãy thêm một số Học sinh và Giáo viên vào cơ sở dữ liệu và sau đó truy xuất nó từ cơ sở dữ liệu.

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

Học sinh và giáo viên được thêm vào cơ sở dữ liệu. NTo truy xuất học sinh và giáo viên,OfType phương thức này sẽ trả về Sinh viên và Giáo viên liên quan đến bộ phận được chỉ định.

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

Trong truy vấn đầu tiên, khi bạn sử dụng OfType <Student> () thì bạn sẽ không thể truy cập HireDate vì thuộc tính HireDate là một phần của Thực thể giáo viên và thuộc tính EnrollmentDate tương tự sẽ không thể truy cập được khi bạn sử dụng OfType <Teacher> ()

Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau:

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

Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.