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();
}