// 🧹 清理環境:移除所有現有資料 var allRecords = _dbCtx1.Records.ToList(); if (allRecords.Any()) { _dbCtx1.Records.RemoveRange(allRecords); _dbCtx1.SaveChanges(); Console.WriteLine($"已移除 {allRecords.Count} 筆資料"); }
// 🌱 初始化:新增一筆種子資料 if (!_dbCtx1.Records.Any()) { _dbCtx1.Records.Add(new DailyRecord { Date = DateTime.Today, User = "Original", EventSummary = "Seed record" }); _dbCtx1.SaveChanges(); }
// 📦 取得第一筆記錄的參考(此時已載入 dbCtx1 的快取) var rec = _dbCtx1.Records.First(); // 🆕 建立新的 DbContext Scope(dbCtx2) using (var scope = _services.CreateScope()) { var dbCtx2 = scope.ServiceProvider.GetRequiredService<JournalDbContext>();
// 📊 第一次查詢:兩個 DbContext 的初始狀態 Console.WriteLine($"Records.Count in dbCtx1 = {_dbCtx1.Records.Count()}"); Console.WriteLine($"1st Record.User in dbCtx1 = {_dbCtx1.Records.First().User}"); Console.WriteLine($"Records.Count in dbCtx2 = {dbCtx2.Records.Count()}"); Console.WriteLine($"1st Record.User in dbCtx2 = {dbCtx2.Records.First().User}");
// ➕ dbCtx2 新增一筆資料 dbCtx2.Records.Add(new DailyRecord { Date = DateTime.Today, User = "Old User", EventSummary = "DBcTX2 Add Me -..-" }); dbCtx2.SaveChanges();
// ✏️ dbCtx1 修改現有資料 rec.User = "New User"; _dbCtx1.SaveChanges();
// 📊 第二次查詢:觀察快取行為 Console.WriteLine($"Records.Count in dbCtx1 = {_dbCtx1.Records.Count()}"); Console.WriteLine($"1st Record.User in dbCtx1 = {_dbCtx1.Records.First().User}"); Console.WriteLine($"Records.Count in dbCtx2 = {dbCtx2.Records.Count()}"); Console.WriteLine($"1st Record.User in dbCtx2 = {dbCtx2.Records.First().User}"); } } }
實驗結果
1 2 3 4 5 6 7 8
Records.Count in dbCtx1 = 1 1st Record.User in dbCtx1 = Original Records.Count in dbCtx2 = 1 1st Record.User in dbCtx2 = Original Records.Count in dbCtx1 = 2 1st Record.User in dbCtx1 = New User Records.Count in dbCtx2 = 2 1st Record.User in dbCtx2 = Original
結果分析
第一次查詢結果分析
1 2 3 4
Records.Count in dbCtx1 = 1 ✅ dbCtx1 只看到自己建立的資料 1st Record.User in dbCtx1 = Original ✅ 顯示原始值 Records.Count in dbCtx2 = 1 ✅ dbCtx2 從資料庫讀取到相同資料 1st Record.User in dbCtx2 = Original ✅ 顯示原始值
重點觀察:
兩個 DbContext 都讀取到相同的資料庫狀態
此時資料庫中只有一筆 “Original” 記錄
📊 第二次查詢結果分析
1 2 3 4
Records.Count in dbCtx1 = 2 // ⚠️ dbCtx1 看到了 dbCtx2 新增的資料 1st Record.Userin dbCtx1 = New User// ✅ 顯示自己修改後的值 Records.Count in dbCtx2 = 2 // ✅ dbCtx2 看到了自己新增的資料 1st Record.Userin dbCtx2 = Original // ❌ 仍顯示快取中的舊值!