Context上下文管理
Q1:臟數據
Q2:一次邏輯操作中,會多次訪問數據庫,增加了數據庫服務器的壓力
>在一次邏輯操作中實現上下文實例唯一
方法一:單例模式:內存的爆炸式增長
在整個運行期間是靜態的,保持加載對象不會被回收,所有跟蹤的對象也都不會被回收
方式二:CallContext(線程數據槽):
1:線程獨享的數據槽。2:集合結構 (web也可以使用HttpContext)
CallContext 類 (System.Runtime.Remoting.Messaging)_files 鏈接: http://pan.baidu.com/s/1c2LRbmo 密碼: 52zp
對比使用EF與ADO.NET
優點:開發簡單快捷,強大的模型設計,跨數據庫支持
缺點:效率低(把EF操作轉換為SQL語句)
1:使用EntityFramework Database First方式創建CustomerInfo表格數據映射
Entity Framework(EF的Database First方法) :http://www.cnblogs.com/Dr-Hao/p/5367147.html

2:新建ContextFactory.cs封裝工廠類
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading.Tasks; namespace CallContextTest { public class CallContextFactory { public static DbContext GetContext() { //通過CallContext數據槽,可以實現線程類實例唯一的功能 DbContext context = CallContext.GetData("context") as DbContext; if (context==null) { context = new MyFirstEFEntities(); CallContext.SetData("context",context); } //每次都新建上下文對象,在一次邏輯操作中,無法保證數據的正確性 //DbContext context = new MyFirstEFEntities(); return context; } } }

3:Program.cs 程序中的測試代碼
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CallContextTest { class Program { static void Main(string[] args) { Test1 test1 = new Test1(); test1.Add(); Test2 test2 = new Test2(); test2.Add(); DbContext context = CallContextFactory.GetContext(); var item = context.Set<CustomerInfo>().Find(1); Console.WriteLine(item.customerName); Console.ReadKey(); } } public class Test1 { public void Add() { DbContext context = CallContextFactory.GetContext(); var item = context.Set<CustomerInfo>().Find(1); item.customerName += "1"; } } public class Test2 { public void Add() { DbContext context = CallContextFactory.GetContext(); var item = context.Set<CustomerInfo>().Find(1); item.customerName += "2"; } } }
最后輸出結果為 item.customerName+"12"; 這樣在一次邏輯操作中,通過CallContext數據槽,可以實現線程類實例唯一的功能,保證數據的正確性。
