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