Entity Framework - ความคงอยู่
ตอนนี้ Entity Framework ช่วยให้คุณได้รับประโยชน์จาก Entity Framework โดยไม่ต้องบังคับให้ทุกส่วนของแอปพลิเคชันของคุณต้องตระหนักถึง Entity Framework แยกเอนทิตีออกจากโครงสร้างพื้นฐาน คุณสามารถสร้างชั้นเรียนที่สามารถมุ่งเน้นไปที่กฎทางธุรกิจของพวกเขาได้โดยไม่ต้องคำนึงถึงวิธีการคงอยู่ (ที่จัดเก็บข้อมูลและวิธีที่ข้อมูลกลับไปกลับมาระหว่างวัตถุของคุณ)
การสร้างเอนทิตีที่เพิกเฉยต่อเนื่อง
ย่อหน้าก่อนหน้านี้อธิบายถึงวิธีการที่ไม่มีความรู้อย่างใกล้ชิดเกี่ยวกับแหล่งที่มาของข้อมูลที่ใช้ สิ่งนี้เน้นถึงสาระสำคัญของความไม่รู้ที่คงอยู่ซึ่งก็คือเมื่อชั้นเรียนของคุณและเลเยอร์แอปพลิเคชันจำนวนมากของเราอยู่รอบ ๆ พวกเขาไม่สนใจว่าข้อมูลจะถูกจัดเก็บอย่างไร
ใน Entity Framework เวอร์ชัน. NET 3.5 หากคุณต้องการใช้คลาสที่มีอยู่ก่อนหน้านี้คุณจะต้องแก้ไขโดยบังคับให้มาจาก EntityObject
ใน. NET 4 สิ่งนี้ไม่จำเป็นอีกต่อไป คุณไม่จำเป็นต้องแก้ไขเอนทิตีของคุณเพื่อให้พวกเขามีส่วนร่วมในการดำเนินการของ Entity Framework
สิ่งนี้ช่วยให้เราสร้างแอปพลิเคชันที่รองรับการเชื่อมต่อแบบหลวม ๆ และการแยกข้อกังวล
ด้วยรูปแบบการเข้ารหัสเหล่านี้ชั้นเรียนของคุณจะเกี่ยวข้องกับงานของตนเองเท่านั้นและหลาย ๆ ชั้นของแอปพลิเคชันของคุณรวมถึง UI จะไม่มีการพึ่งพาตรรกะภายนอกเช่น Entity Framework APIs แต่ API ภายนอกเหล่านั้นสามารถโต้ตอบกับเราได้ เอนทิตี
มี 2 วิธี (เชื่อมต่อและตัดการเชื่อมต่อ) เมื่อยังคงมีเอนทิตีด้วย Entity Framework ทั้งสองทางมีความสำคัญในตัวเอง ในกรณีของสถานการณ์จำลองที่เชื่อมต่อการเปลี่ยนแปลงจะถูกติดตามโดยบริบท แต่ในกรณีของสถานการณ์ที่ถูกตัดการเชื่อมต่อเราจำเป็นต้องแจ้งบริบทเกี่ยวกับสถานะของเอนทิตี
สถานการณ์ที่เชื่อมต่อ
สถานการณ์ที่เชื่อมต่อคือเมื่อมีการดึงข้อมูลเอนทิตีจากฐานข้อมูลและแก้ไขในบริบทเดียวกัน สำหรับสถานการณ์ที่เชื่อมต่อให้เราสมมติว่าเรามีบริการ Windows และเรากำลังดำเนินการทางธุรกิจบางอย่างกับเอนทิตีนั้นดังนั้นเราจะเปิดบริบทวนรอบเอนทิตีทั้งหมดดำเนินธุรกิจของเราแล้วบันทึกการเปลี่ยนแปลงด้วยบริบทเดียวกัน เปิดตั้งแต่ต้น
มาดูตัวอย่างต่อไปนี้ที่นักเรียนดึงข้อมูลจากฐานข้อมูลและอัปเดตชื่อของนักเรียนจากนั้นบันทึกการเปลี่ยนแปลงลงในฐานข้อมูล
class Program {
static void Main(string[] args) {
using (var context = new MyContext()) {
var studentList = context.Students.ToList();
foreach (var stdnt in studentList) {
stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
}
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะได้รับผลลัพธ์ต่อไปนี้และคุณจะเห็นว่า Edited word ถูกแนบมาก่อนชื่อดังที่แสดงในผลลัพธ์ต่อไปนี้
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Mark Upston
สถานการณ์ที่ไม่เชื่อมต่อ
สถานการณ์ที่ไม่เชื่อมต่อคือเมื่อมีการดึงเอนทิตีจากฐานข้อมูลและแก้ไขในบริบทที่แตกต่างกัน สมมติว่าเราต้องการแสดงข้อมูลบางส่วนใน Presentation Layer และเรากำลังใช้แอปพลิเคชัน n-tier ดังนั้นจึงเป็นการดีกว่าที่จะเปิดบริบทดึงข้อมูลและปิดบริบทในที่สุด เนื่องจากที่นี่เราได้ดึงข้อมูลและปิดบริบทเอนทิตีที่เราดึงข้อมูลจึงไม่ถูกติดตามอีกต่อไปและนี่คือสถานการณ์ที่ขาดการเชื่อมต่อ
มาดูโค้ดต่อไปนี้ซึ่งมีการเพิ่มเอนทิตี Student ที่ไม่ได้เชื่อมต่อใหม่ลงในบริบทโดยใช้วิธีการเพิ่ม
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
};
using (var context = new MyContext()) {
context.Students.Add(student);
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะได้รับผลลัพธ์ต่อไปนี้
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram