Entity Framework Context上下文管理(CallContext 數據槽)

Context上下文管理html

Q1:髒數據web

Q2:一次邏輯操做中,會屢次訪問數據庫,增長了數據庫服務器的壓力數據庫

>在一次邏輯操做中實現上下文實例惟一服務器

方法一:單例模式:內存的爆炸式增加測試

    在整個運行期間是靜態的,保持加載對象不會被回收,全部跟蹤的對象也都不會被回收spa

方式二:CallContext(線程數據槽):線程

    1:線程獨享的數據槽。2:集合結構 (web也能夠使用HttpContext)設計

CallContext 類 (System.Runtime.Remoting.Messaging)_files 連接: http://pan.baidu.com/s/1c2LRbmo  密碼: 52zpcode

對比使用EF與ADO.NEThtm

優勢:開發簡單快捷,強大的模型設計,跨數據庫支持

缺點:效率低(把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數據槽,能夠實現線程類實例惟一的功能,保證數據的正確性。

相關文章
相關標籤/搜索