Entity Framework-상속

상속을 통해 개발자가 생각하는 방식을 더 잘 반영하고 해당 모델과 상호 작용하는 데 필요한 작업을 줄이는 복잡한 모델을 만들 수 있습니다. 엔터티에 사용되는 상속은 클래스에 사용되는 상속과 동일한 목적으로 사용되므로 개발자는 이미이 기능이 작동하는 방법의 기본 사항을 알고 있습니다.

다음 예제를 살펴보고 새 콘솔 애플리케이션 프로젝트를 만들어 보겠습니다.

Step 1 − 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하여 ADO.NET 엔티티 데이터 모델을 추가하고 추가 → 새 항목…을 선택합니다.

Step 2 − 모델 우선 접근 방식 장에 언급 된 모든 단계에 따라 하나의 엔티티를 추가하고 이름을 Person으로 지정합니다.

Step 3 − 다음 이미지와 같이 일부 스칼라 속성을 추가합니다.

Step 4 − 엔티티를 두 개 더 추가합니다 StudentTeacher이는 Person Table의 속성을 상속합니다.

Step 5 − 이제 Student 엔티티를 추가하고 다음 이미지와 같이 기본 유형 콤보 상자에서 Person을 선택합니다.

Step 6 − 마찬가지로 Teacher 엔티티를 추가합니다.

Step 7 − 이제 EnrollmentDate 스칼라 속성을 학생 엔티티에 추가하고 HireDate 속성을 Teacher 엔티티에 추가합니다.

Step 8 − 계속해서 데이터베이스를 생성 해 보겠습니다.

Step 9 − 디자인 화면을 마우스 오른쪽 버튼으로 클릭하고 모델에서 데이터베이스 생성…을 선택합니다.

Step 10− 새 데이터베이스를 생성하려면 New Connection…을 클릭합니다. 다음 대화 상자가 열립니다. 확인을 클릭하십시오.

Step 11− 마침을 클릭합니다. 그러면 프로젝트에 * .edmx.sql 파일이 추가됩니다. .sql 파일을 열어 Visual Studio에서 DDL 스크립트를 실행할 수 있습니다. 이제 마우스 오른쪽 버튼을 클릭하고 실행을 선택합니다.

Step 12 − 서버 탐색기로 이동하면 지정된 세 개의 테이블로 데이터베이스가 생성 된 것을 볼 수 있습니다.

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

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

학생과 교사가 데이터베이스에 추가됩니다. NTo는 학생과 교사를 검색합니다.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 속성이 Teacher Entity의 일부이고 마찬가지로 EnrollmentDate 속성은 OfType <Teacher> ()를 사용할 때 액세스 할 수 없기 때문에 HireDate에 액세스 할 수 없습니다.

위의 코드가 실행되면 다음과 같은 출력을 받게됩니다.

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

더 나은 이해를 위해 위의 예를 단계별로 실행하는 것이 좋습니다.