Entity Framework - การดำเนินการฐานข้อมูล

ในบทก่อนหน้านี้คุณได้เรียนรู้วิธีการกำหนดโมเดลข้อมูลเอนทิตีที่แตกต่างกันสามวิธี

  • สองในนั้นคือ Database First และ Model First ขึ้นอยู่กับตัวออกแบบ Entity Framework รวมกับการสร้างโค้ด

  • ประการที่สาม Code First ช่วยให้คุณสามารถข้ามนักออกแบบภาพและเขียนโค้ดของคุณเองได้

  • ไม่ว่าคุณจะเลือกเส้นทางใดคุณจะได้รับคลาสโดเมนและคลาสเอนทิตีเฟรมเวิร์ก DbContext อย่างน้อยหนึ่งคลาสช่วยให้คุณสามารถดึงและเก็บรักษาข้อมูลที่เกี่ยวข้องกับคลาสเหล่านั้นได้

DbContext API ในแอปพลิเคชันของคุณใช้เป็นสะพานเชื่อมระหว่างคลาสและฐานข้อมูลของคุณ DbContext เป็นหนึ่งในคลาสที่สำคัญที่สุดใน Entity Framework

  • ช่วยให้สามารถแสดงและดำเนินการสืบค้น

  • ใช้ผลลัพธ์แบบสอบถามจากฐานข้อมูลและแปลงเป็นอินสแตนซ์ของคลาสโมเดลของเรา

  • สามารถติดตามการเปลี่ยนแปลงของเอนทิตีรวมถึงการเพิ่มและการลบจากนั้นทริกเกอร์การสร้างคำสั่งแทรกอัปเดตและลบที่ส่งไปยังฐานข้อมูลตามต้องการ

ต่อไปนี้เป็นคลาสบริบทโฆษณาโดเมนที่เราจะดำเนินการต่างๆในบทนี้ นี่เป็นตัวอย่างเดียวกับที่เราได้สร้างขึ้นในฐานข้อมูลแนวทางแรก

การปรับใช้คลาสบริบท

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;

namespace DatabaseFirstDemo {

   public partial class UniContextEntities : DbContext {

      public UniContextEntities(): base("name = UniContextEntities") {}

      protected override void OnModelCreating(DbModelBuilder modelBuilder) {
         throw new UnintentionalCodeFirstException();
      }

      public virtual DbSet<Course> Courses { get; set; }
      public virtual DbSet<Enrollment> Enrollments { get; set; }
      public virtual DbSet<Student> Students { get; set; }
   }
}

การใช้คลาสโดเมน

ชั้นเรียน

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic;
	
   public partial class Course {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Course() {
         this.Enrollments = new HashSet<Enrollment>();
      }
	
      public int CourseID { get; set; }
      public string Title { get; set; }
      public int Credits { get; set; }
	
      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
			
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

ชั้นนักเรียน

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic; 

   public partial class Student {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Student() {
         this.Enrollments = new HashSet<Enrollment>();
      }

      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public System.DateTime EnrollmentDate { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
			
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

การลงทะเบียนเรียน

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic; 

   public partial class Enrollment {

      public int EnrollmentID { get; set; }
      public int CourseID { get; set; }
      public int StudentID { get; set; }
      public Nullable<int> Grade { get; set; }
		
      public virtual Course Course { get; set; }
      public virtual Student Student { get; set; }
   }
}

สร้างการดำเนินการ

การเพิ่มอ็อบเจ็กต์ใหม่ด้วย Entity Framework ทำได้ง่ายเพียงแค่สร้างอินสแตนซ์ใหม่ของอ็อบเจ็กต์ของคุณและลงทะเบียนโดยใช้เมธอด Add บน DbSet รหัสต่อไปนี้ช่วยให้คุณสามารถเพิ่มนักเรียนใหม่ในฐานข้อมูลได้

class Program {

   static void Main(string[] args) {

      var newStudent = new Student();

      //set student name

      newStudent.FirstMidName = "Bill";
      newStudent.LastName = "Gates";
      newStudent.EnrollmentDate = DateTime.Parse("2015-10-21");
      newStudent.ID = 100;

      //create DBContext object

      using (var dbCtx = new UniContextEntities()) {

         //Add Student object into Students DBset
         dbCtx.Students.Add(newStudent);

         // call SaveChanges method to save student into database
         dbCtx.SaveChanges();
      }
   }
}

อัปเดตการทำงาน

การเปลี่ยนออบเจ็กต์ที่มีอยู่ทำได้ง่ายเพียงแค่อัปเดตค่าที่กำหนดให้กับคุณสมบัติที่คุณต้องการเปลี่ยนแปลงและเรียกใช้ SaveChanges ตัวอย่างเช่นรหัสต่อไปนี้ใช้เพื่อเปลี่ยนนามสกุลของ Ali จาก Khan เป็น Aslam

using (var context = new UniContextEntities()) {

   var student = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
   student.LastName = "Aslam";
   context.SaveChanges();
}

ลบการทำงาน

ในการลบเอนทิตีโดยใช้ Entity Framework คุณใช้เมธอด Remove บน DbSet ลบงานสำหรับทั้งเอนทิตีที่มีอยู่และเพิ่มใหม่ การเรียก Remove ในเอนทิตีที่ถูกเพิ่ม แต่ยังไม่ได้บันทึกลงในฐานข้อมูลจะยกเลิกการเพิ่มเอนทิตี เอนทิตีจะถูกลบออกจากตัวติดตามการเปลี่ยนแปลงและไม่ถูกติดตามโดย DbContext อีกต่อไป การเรียกลบในเอนทิตีที่มีอยู่ซึ่งกำลังถูกติดตามการเปลี่ยนแปลงจะลงทะเบียนเอนทิตีสำหรับการลบในครั้งถัดไปที่เรียก SaveChanges ตัวอย่างต่อไปนี้เป็นรหัสที่นักเรียนถูกลบออกจากฐานข้อมูลซึ่งมีชื่อแรกคือ Ali

using (var context = new UniContextEntities()) {
   var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
   context.Students.Remove(bay);
   context.SaveChanges();
}

อ่านการทำงาน

การอ่านข้อมูลที่มีอยู่จากฐานข้อมูลนั้นง่ายมาก ต่อไปนี้เป็นรหัสที่เรียกข้อมูลทั้งหมดจากตารางนักเรียนจากนั้นโปรแกรมจะแสดงพร้อมชื่อและนามสกุลของนักเรียนตามลำดับตัวอักษร

using (var db = new UniContextEntities()) {

   var query = from b in db.Students orderby b.FirstMidName select b;
   Console.WriteLine("All All student in the database:");

   foreach (var item in query) {
      Console.WriteLine(item.FirstMidName +" "+ item.LastName);
   }

   Console.WriteLine("Press any key to exit...");
   Console.ReadKey();
}