首页 > 代码库 > EF上下文管理

EF上下文管理

1.一次请求过来与数据库交互一次。每次操作表都using() 性能差(可以随时释放)

2.N 次操作共用一个DbContext 性能可想而知

3.Web:一个请求共用一个上下文实例

4.WinForm:用using()

实例:

  public static MyDbContext GetCurrentDbContext()
        {
            MyDbContext dbcontext = HttpContext.Current.Items["MyDbContext"] as MyDbContext;
            //当前Http上下文不存在当前对象
            if (dbcontext == null)
            {
                dbcontext = new MyDbContext();
                HttpContext.Current.Items.Add("", dbcontext);
            }
            return dbcontext;
}

 调用:

  protected void Page_Load(object sender, EventArgs e)
        {
            var dbCotnext = DbContextHelper.GetCurrentDbContext();
        }

 CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。

数据槽不在其他逻辑线程上的调用上下文之间共享。 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。

   //一个线程共用一个上下文实例。一次请求就用一个线程。
            MyDbContext dbContext = CallContext.GetData("DbContext") as MyDbContext;
            
            if (dbContext == null)
            {
                dbContext =new MyDbContext();
                CallContext.SetData("DbContext",dbContext);
            }
            return dbContext;

 为什么用EF而不用原生的Ado.Net?

1、极大的提高开发效率:EF是微软自己的产品,跟VS开发工具集成度比较好,开发中代码都是强类型的,写代码效率非常高,自动化程度非常高,命令式的编程。

2、EF提供的模型设计器非常强大,不仅仅带来了设计数据库的革命,也附带来的自动化生成模型代码的功能也极大的提高开发和架构设计的效率

3、EF跨数据支持是ORM框架主要功能点之一,带来的是可以通过仅仅改变配置就可以做到跨数据库的能力。

4、缺陷:性能差(生成sql脚本阶段),在复杂查询的时候生成的sql脚本效率不是很高。
    1、不在数据端额外的消耗性能。
    2、根据xml映射关系以及实体的状态生成相应的sql脚本。
做企业内部管理系统:
进销存、CRM、HR、OA、ERP、政务系统

 

MVC和WebFrom的区别:

技术分享

 

控制器的作用:

1.接受用户的请求:表单中获取数据,从querystring或者Session、Cookie中处理用户的数据

2.调用业务逻辑层

3.把数据给前台aspx页面传递数据

EF上下文管理