在工作中有个疑问,就是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; } }
方案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"]; } }