dbcontext实例创建问题
dbcontext初始化
Private DemoContext db=new DemoContext ();
问题:什么时候释放db对象?
使用Using()方法中创建,每次调用会造成频繁的连接关闭数据库
可能会想到对象全局唯一使用单例模式,倘若多个用户操作的时候就是操作同一个数据库,所以必须是线程内全局唯一
解决:MVC中,把EF对象放入到一个线程中,新建一个Base控制器,作为其他控制器基类
添加命名空间引用:
using System.Runtime.Remoting.Messaging;
控制器代码:
public class BaseController : Controller { //方式一 public DBContext db { get { //从当前线程中获取 DBContext对象 DBContext db = CallContext.GetData("DB") as DBContext; if (db == null) { db = new DBContext(); //放入数据槽,来使线程内唯一 CallContext.SetData("DB", db); } return db; } } //方式二 public DBContext DB2 { get { DBContext db = null; if (HttpContext.Items["db1"] == null) { db = new DBContext(); HttpContext.Items["db1"] = db; } else { db = HttpContext.Items["db1"] as DBContext; } return db; } } }
CallContext:是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享
HttpContext:不同用户的请求,服务器都会创建一个新的HttpContext实例,直到请求结束为止,服务器就会销毁这个实例。