- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 斷開連線的實體
- 實體框架 - 表值函式
- 實體框架 - 本機SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 持久化
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 渴望載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註釋
- 實體框架 - Fluent API
- 實體框架 - 種子資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 斷開連線的實體
在本章中,讓我們看看如何對上下文未跟蹤的實體進行更改。上下文未跟蹤的實體被稱為“斷開連線”的實體。
對於大多數單層應用程式,其中使用者介面和資料庫訪問層在同一個應用程式程序中執行,您可能只會對上下文正在跟蹤的實體執行操作。
對斷開連線的實體的操作在 N 層應用程式中更為常見。
N 層應用程式涉及在伺服器上獲取一些資料並將其透過網路返回到客戶端機器。
然後,客戶端應用程式操作這些資料,然後將其返回到伺服器以進行持久化。
以下是需要對斷開連線的實體圖甚至單個斷開連線的實體採取的兩個步驟。
將實體附加到新的上下文例項,並使上下文了解這些實體。
手動為這些實體設定適當的 EntityStates。
讓我們看一下以下程式碼,其中 Student 實體添加了兩個 Enrollment 實體。
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse("2015-10-10"),
Enrollments = new List<Enrollment> {
new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
}
};
using (var context = new UniContextEntities()) {
context.Students.Add(student);
Console.WriteLine("New Student ({0} {1}): {2}",
student.FirstMidName, student.LastName, context.Entry(student).State);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0} State: {1}",
enrollment.EnrollmentID, context.Entry(enrollment).State);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
程式碼構造了一個新的 Student 例項,該例項還在其 Enrollments 屬性中引用了兩個新的 Enrollment 例項。
然後,使用 Add 方法將新的 Student 新增到上下文中。
新增 Student 後,程式碼使用 DbContext.Entry 方法訪問實體框架關於新 Student 的更改跟蹤資訊。
從這些更改跟蹤資訊中,State 屬性用於輸出實體的當前狀態。
然後對從新 Student 引用的每個新建立的 Enrollments 重複此過程。如果執行應用程式,您將收到以下輸出:
New Student (Wasim Akram): Added Enrollment ID: 2001 State: Added Enrollment ID: 2002 State: Added Press any key to exit...
DbSet.Add 用於告訴實體框架關於新實體,而 DbSet.Attach 用於告訴實體框架關於現有實體。Attach 方法會將實體標記為 Unchanged 狀態。
讓我們看一下以下 C# 程式碼,其中斷開連線的實體附加到 DbContext。
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse("2015-10-10"),
Enrollments = new List<Enrollment> {
new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
}
};
using (var context = new UniContextEntities()) {
context.Students.Attach(student);
Console.WriteLine("New Student ({0} {1}): {2}",
student.FirstMidName, student.LastName, context.Entry(student).State);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID,
context.Entry(enrollment).State);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
當使用 Attach() 方法執行上述程式碼時,您將收到以下輸出。
New Student (Wasim Akram): Unchanged Enrollment ID: 2001 State: Unchanged Enrollment ID: 2002 State: Unchanged Press any key to exit...
廣告