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实例,直到请求结束为止,服务器就会销毁这个实例。

 

posted @ 2017-05-17 00:23  【可乐不加冰】  阅读(860)  评论(0编辑  收藏  举报