Entity Framework - เอนทิตีที่ไม่ได้เชื่อมต่อ
ในบทนี้ให้เราดูวิธีการเปลี่ยนแปลงเอนทิตีที่บริบทไม่ถูกติดตาม เอนทิตีที่ไม่ได้ถูกติดตามโดยบริบทเรียกว่าเอนทิตี 'ไม่เชื่อมต่อ'
สำหรับแอปพลิเคชันระดับเดียวส่วนใหญ่ที่อินเทอร์เฟซผู้ใช้และเลเยอร์การเข้าถึงฐานข้อมูลทำงานในกระบวนการแอปพลิเคชันเดียวกันคุณอาจจะดำเนินการกับเอนทิตีที่ถูกติดตามโดยบริบท
การดำเนินการกับเอนทิตีที่ไม่ได้เชื่อมต่อนั้นพบได้บ่อยในแอปพลิเคชัน N-Tier
แอปพลิเคชัน N-Tier เกี่ยวข้องกับการดึงข้อมูลบางอย่างบนเซิร์ฟเวอร์และส่งคืนผ่านเครือข่ายไปยังเครื่องไคลเอนต์
จากนั้นไคลเอนต์แอปพลิเคชันจะจัดการข้อมูลนี้ก่อนที่จะส่งคืนไปยังเซิร์ฟเวอร์เพื่อคงอยู่
ต่อไปนี้เป็นสองขั้นตอนที่ต้องดำเนินการกับกราฟเอนทิตีที่ถูกตัดการเชื่อมต่อหรือแม้แต่เอนทิตีที่ถูกตัดการเชื่อมต่อเดียว
แนบเอนทิตีด้วยอินสแตนซ์บริบทใหม่และทำให้บริบททราบเกี่ยวกับเอนทิตีเหล่านี้
ตั้งค่า EntityStates ที่เหมาะสมให้กับเอนทิตีเหล่านี้ด้วยตนเอง
มาดูโค้ดต่อไปนี้ซึ่งมีการเพิ่มเอนทิตีนักศึกษาด้วยเอนทิตีการลงทะเบียนสองเอนทิตี
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse("2015-10-10"),
Enrollments = new List<Enrollment> {
new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
}
};
using (var context = new UniContextEntities()) {
context.Students.Add(student);
Console.WriteLine("New Student ({0} {1}): {2}",
student.FirstMidName, student.LastName, context.Entry(student).State);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0} State: {1}",
enrollment.EnrollmentID, context.Entry(enrollment).State);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
โค้ดนี้สร้างอินสแตนซ์ Student ใหม่ซึ่งอ้างอิงอินสแตนซ์การลงทะเบียนใหม่สองอินสแตนซ์ในคุณสมบัติการลงทะเบียน
จากนั้นนักเรียนใหม่จะถูกเพิ่มลงในบริบทโดยใช้วิธีการเพิ่ม
เมื่อเพิ่ม Student แล้วโค้ดจะใช้เมธอด DbContext.Entry เพื่อเข้าถึงข้อมูลการติดตามการเปลี่ยนแปลงที่ Entity Framework มีเกี่ยวกับ Student ใหม่
จากข้อมูลการติดตามการเปลี่ยนแปลงนี้คุณสมบัติของรัฐจะใช้เพื่อเขียนสถานะปัจจุบันของเอนทิตี
จากนั้นกระบวนการนี้จะทำซ้ำสำหรับการลงทะเบียนที่สร้างขึ้นใหม่แต่ละรายการที่อ้างอิงจากนักเรียนใหม่ หากคุณเรียกใช้แอปพลิเคชันคุณจะได้รับผลลัพธ์ต่อไปนี้ -
New Student (Wasim Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...
ในขณะที่ DbSet.Add ใช้เพื่อบอก Entity Framework เกี่ยวกับเอนทิตีใหม่ DbSet.Attach ใช้เพื่อบอก Entity Framework เกี่ยวกับเอนทิตีที่มีอยู่ วิธีการแนบจะทำเครื่องหมายเอนทิตีในสถานะไม่เปลี่ยนแปลง
ลองดูรหัส C # ต่อไปนี้ที่แนบเอนทิตีที่ไม่ได้เชื่อมต่อกับ DbContext
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse("2015-10-10"),
Enrollments = new List<Enrollment> {
new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
}
};
using (var context = new UniContextEntities()) {
context.Students.Attach(student);
Console.WriteLine("New Student ({0} {1}): {2}",
student.FirstMidName, student.LastName, context.Entry(student).State);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID,
context.Entry(enrollment).State);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
เมื่อโค้ดด้านบนถูกเรียกใช้ด้วยเมธอด Attach () คุณจะได้รับผลลัพธ์ต่อไปนี้
New Student (Wasim Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...