
- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 斷開連線的實體
- 實體框架 - 表值函式
- 實體框架 - 原生 SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 持久化
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 渴望載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註釋
- 實體框架 - Fluent API
- 實體框架 - 填充資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個 DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 資料庫操作
在前面的章節中,您學習了三種不同的定義實體資料模型的方法。
其中兩種,資料庫優先和模型優先,依賴於實體框架設計器以及程式碼生成。
第三種,程式碼優先,允許您跳過視覺化設計器,只需編寫自己的程式碼。
無論您選擇哪種路徑,最終都會得到領域類和一個或多個實體框架 DbContext 類,這些類允許您檢索和持久化與這些類相關的資料。
應用程式中的 DbContext API 用作類和資料庫之間的橋樑。DbContext 是實體框架中最重要的類之一。
它能夠表達和執行查詢。
它從資料庫獲取查詢結果並將其轉換為模型類的例項。
它可以跟蹤對實體的更改,包括新增和刪除,然後觸發建立插入、更新和刪除語句,這些語句根據需要傳送到資料庫。
以下是我們將在本章中執行不同操作的領域和上下文類。這與我們在資料庫優先方法一章中建立的示例相同。
上下文類實現
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; } } }
建立操作
使用實體框架新增新物件就像構造物件的新例項並在 DbSet 上使用 Add 方法註冊它一樣簡單。以下程式碼允許您向資料庫新增新學生。
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(); }
刪除操作
要使用實體框架刪除實體,請在 DbSet 上使用 Remove 方法。Remove 對現有實體和新新增的實體都有效。對已新增但尚未儲存到資料庫的實體呼叫 Remove 將取消對該實體的新增。該實體將從更改跟蹤器中刪除,並且 DbContext 不再跟蹤它。對正在進行更改跟蹤的現有實體呼叫 Remove 將在下次呼叫 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(); }
讀取操作
讀取資料庫中的現有資料非常簡單。以下是檢索 Student 表中所有資料的程式碼,然後程式將以字母順序顯示學生的姓名。
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(); }