實體框架 - 繼承



繼承使建立更復雜、更能反映開發者思維方式的模型成為可能,同時減少了與這些模型互動所需的工作量。與實體一起使用的繼承與與類一起使用的繼承具有相同的用途,因此開發者已經瞭解此功能的工作原理。

讓我們看一下以下示例,並透過建立一個新的控制檯應用程式專案。

步驟 1 - 透過右鍵單擊專案名稱並選擇新增 → 新建項…新增 ADO.NET 實體資料模型。

步驟 2 - 新增一個實體並將其命名為 Person,按照模型優先方法一章中提到的所有步驟進行操作。

步驟 3 - 新增一些標量屬性,如下面的影像所示。

Add Scalar Properties

步驟 4 - 我們將新增另外兩個實體學生教師,它們將繼承 Person 表的屬性。

步驟 5 - 現在新增 Student 實體,並從“基型別”組合框中選擇 Person,如下面的影像所示。

Base Type ComboBox

步驟 6 - 同樣新增 Teacher 實體。

步驟 7 - 現在將 EnrollmentDate 標量屬性新增到 Student 實體,並將 HireDate 屬性新增到 Teacher 實體。

EnrollmentDate

步驟 8 - 讓我們繼續生成資料庫。

步驟 9 - 右鍵單擊設計圖面,然後選擇“從模型生成資料庫…”。

Generate Database

步驟 10 - 要建立新的資料庫,請單擊“新建連線…”。將開啟以下對話方塊。單擊“確定”。

New Database

步驟 11 - 單擊“完成”。這將在專案中新增一個 *.edmx.sql 檔案。您可以透過開啟 .sql 檔案在 Visual Studio 中執行 DDL 指令碼。現在右鍵單擊並選擇“執行”。

步驟 12 - 轉到伺服器資源管理器,您將看到已建立了三個指定表名資料庫。

Database Created Table

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

以下是 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; }
}

讓我們向資料庫中新增一些學生和教師,然後從資料庫中檢索它們。

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

學生和教師已新增到資料庫中。要檢索學生和教師,需要使用OfType方法,該方法將返回與指定部門相關的學生和教師。

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 實體的一部分,並且類似地,當您使用 OfType<Teacher>() 時,EnrollmentDate 屬性將不可訪問。

執行上述程式碼時,您將收到以下輸出 -

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

我們建議您逐步執行以上示例,以便更好地理解。

廣告