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数据槽,能够实现线程类实例惟一的功能,保证数据的正确性。

相关文章
相关标签/搜索