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
*****************************************************************
เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น