EF上下文容器,保存线程唯一性

     在工作中有个疑问,就是EF上下文容器到底创建了多少个?

在asp.net中,EF上下文容器。如果只要有一个,则每次一个用户访问,添加一些实体,然后又不会自动销毁,就会造成内存爆炸。如果每次创建一个,则就出现一个实例调用混乱。在sp.net中,保证一个线程(一次http请求及一个管道事件),一个EF上下文容器就刚刚好,解决上面问题。

一个线程一个上下文容器,

解决方案1:线程缓存

保证一个请求线程中只有一份EF容器
        protected BaseDbContext db
        {
            get
            {
                //向线程缓存中查询,如果返回的是null,则创建,同时存入到这个线程缓存中
                //注意的是线程缓存CallContext,而不是我们熟悉的HttpRuntime.cache
                object efDbContext = CallContext.GetData("BaseDbContext");
                if (efDbContext == null)
                {
                    efDbContext = new BaseDbContext();
                    //存入到这个线程缓存中
                    CallContext.SetData("BaseDbContext", efDbContext);
                }
                return efDbContext as BaseDbContext;
            }
        }
View Code

方案2:将上下文容器保存到httpContext.Current.Items["db"]中(httpContext也是每次请求创建一个,管道事件结束就销毁)

public static class EFFactory
        {
            public static object GetCurrentEFContext()
            {
                if (HttpContext.Current.Items["EFContxt"]==null)
                {
                    HttpContext.Current.Items["EFContxt"]= new BaseDbContext();
                }
                return HttpContext.Current.Items["EFContxt"];
            }
        }
View Code
原文地址:https://www.cnblogs.com/zhuyapeng/p/5460324.html