- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 資料型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 離線實體
- 實體框架 - 表值函式
- 實體框架 - 原生SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 持久化
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 渴望載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體(此處翻譯可能需要根據上下文調整,例如“著色實體”或其他更合適的描述)
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註解
- 實體框架 - Fluent API
- 實體框架 - 填充資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 持久化
實體框架現在允許您在不強制應用程式的每個部分都瞭解實體框架的情況下,從實體框架中獲益,從而將實體與基礎架構分離。您可以建立專注於其業務規則的類,而無需考慮它們的持久化方式(資料儲存位置以及資料在物件之間來回傳遞的方式)。
建立持久化無關實體
上一段描述了一種方法,該方法對它所使用的資料來源一無所知。這突出了持久化無關性的本質,即您的類和圍繞它們的許多應用程式層都不關心資料如何儲存。
在實體框架的 .NET 3.5 版本中,如果您想使用預先存在的類,則需要透過強制它們派生自 EntityObject 來修改它們。
在 .NET 4 中,這不再需要。您無需修改實體即可讓它們參與實體框架操作。
這使我們能夠構建採用鬆散耦合和關注點分離的應用程式。
使用這些編碼模式,您的類只關心它們自己的工作,並且您的應用程式的許多層(包括UI)都不依賴於外部邏輯(例如實體框架 API),但這些外部 API 能夠與我們的實體互動。
使用實體框架持久化實體時,有兩種方法(連線和斷開連線)。這兩種方法都有其重要性。在連線的情況下,更改由上下文跟蹤,但在斷開連線的情況下,我們需要將實體的狀態告知上下文。
連線場景
連線場景是指從資料庫中檢索實體並在同一上下文中修改實體。對於連線場景,假設我們有一個 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();
}
}
}
編譯並執行上述程式碼後,您將收到以下輸出,並且您將看到“已編輯”一詞附加在名字前面,如下所示。
Retrieve all Students from the database: ID: 1, Name: Edited Edited Alain Bomer ID: 2, Name: Edited Edited Mark Upston
斷開連線場景
斷開連線場景是指從資料庫中檢索實體並在不同的上下文中修改實體。假設我們想在表示層中顯示一些資料,並且我們正在使用某種分層應用程式,那麼最好開啟上下文,獲取資料,最後關閉上下文。由於我們在這裡已經獲取了資料並關閉了上下文,因此我們獲取的實體不再被跟蹤,這就是斷開連線場景。
讓我們來看一下下面的程式碼,其中使用 Add 方法將新的斷開連線的學生實體新增到上下文中。
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