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


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數據槽,可以實現線程類實例唯一的功能,保證數據的正確性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM