实体框架 - 继承



继承使创建更复杂、更能反映开发者思维方式的模型成为可能,同时减少了与这些模型交互所需的工作量。与实体一起使用的继承与与类一起使用的继承具有相同的用途,因此开发者已经了解此功能的工作原理。

让我们看一下以下示例,并通过创建一个新的控制台应用程序项目。

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

我们建议您逐步执行以上示例,以便更好地理解。

广告

© . All rights reserved.