- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 資料型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 離線實體
- 實體框架 - 表值函式
- 實體框架 - 原生SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 持久化
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 積極載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體 (此處翻譯可能需要根據實際含義調整)
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註解
- 實體框架 - Fluent API
- 實體框架 - 種子資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 併發
任何資料訪問開發人員在回答關於資料併發的問題時都會遇到困難,“如果多個人同時編輯相同的資料會發生什麼?”
我們當中比較幸運的人會處理這樣的業務規則:“沒問題,最後儲存的獲勝”。
在這種情況下,併發不是問題。更可能的是,情況並非如此簡單,並且沒有萬能的解決方案可以一次解決所有場景。
預設情況下,實體框架將採用“最後儲存的獲勝”的方式,這意味著即使有人在檢索資料和儲存資料之間更新了資料,也會應用最新的更新。
讓我們來看一個例子來更好地理解它。下面的例子在Course表中添加了一個新的列VersionNo。
轉到設計器,右鍵單擊設計器視窗,然後選擇“從資料庫更新模型…”。
您將看到在Course實體中添加了另一列。
右鍵單擊新建立的列VersionNo,選擇“屬性”,並將併發模式更改為“固定”,如下面的影像所示。
將Course.VersionNo的ConcurrencyMode設定為Fixed後,每當更新Course時,Update命令將使用其EntityKey和VersionNo屬性查詢Course。
讓我們來看一個簡單的場景。兩個使用者同時檢索相同的課程,使用者1將該課程的標題更改為數學並儲存更改,然後是使用者2。稍後,當用戶2更改在使用者1儲存更改之前檢索到的該課程的標題時,使用者2將收到併發異常“**使用者2:發生了樂觀併發異常**”。
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
namespace DatabaseFirstDemo {
class Program {
static void Main(string[] args) {
Course c1 = null;
Course c2 = null;
//User 1 gets Course
using (var context = new UniContextEntities()) {
context.Configuration.ProxyCreationEnabled = false;
c1 = context.Courses.Where(s ⇒ s.CourseID == 1).Single();
}
//User 2 also get the same Course
using (var context = new UniContextEntities()) {
context.Configuration.ProxyCreationEnabled = false;
c2 = context.Courses.Where(s ⇒ s.CourseID == 1).Single();
}
//User 1 updates Course Title
c1.Title = "Edited from user1";
//User 2 updates Course Title
c2.Title = "Edited from user2";
//User 1 saves changes first
using (var context = new UniContextEntities()) {
try {
context.Entry(c1).State = EntityState.Modified;
context.SaveChanges();
} catch (DbUpdateConcurrencyException ex) {
Console.WriteLine("User1: Optimistic Concurrency exception occurred");
}
}
//User 2 saves changes after User 1.
//User 2 will get concurrency exection
//because CreateOrModifiedDate is different in the database
using (var context = new UniContextEntities()) {
try {
context.Entry(c2).State = EntityState.Modified;
context.SaveChanges();
} catch (DbUpdateConcurrencyException ex) {
Console.WriteLine("User2: Optimistic Concurrency exception occurred");
}
}
}
}
}
廣告