none
ObjectContext对象需要被using块包含起来吗? RRS feed

  • 问题

  • 我现在有如下一段代码:

    public IQuaryable<EntityObject> GetPaginiationData(string name,int currentPage,int pageSize)
    {
      DreamSchoolEntities context = new DreamSchoolEntities();
    
      string esql = "select value teacher from DreamSchoolEntities." + name + " as teacher order by teacher.Id skip " + currentPage * pageSize + " limit " + pageSize;
      result = context.CreateQuery<EntityObject>(esql);
      esql = "select value t from DreamSchoolEntities." + name + " as t";
    totalCount = context.CreateQuery<EntityObject>(esql).Count();
    
      return result;
    }
    

    跑起来倒是没啥问题,知识不确定这个方法中的 DreamSchoolEntities(就是 EF 的ObjectContext)是否应该被 using 块包含住。

    因为如果包含起来的话,我的表示层想拿到它的结果作为数据源赋给 Repeater,然后调用Repeater的DataBind()方法时就会发生异常,提示我 ObjectContext 已经关闭。想提前在业务逻辑层用它的ToList()方法也是会引发同样的错误。

    所以为了先让功能能跑通,我就把 using 块去掉了,但是总感觉心里没底儿,希望对此比较了解的朋友能给我解答一下,谢谢!

    2010年10月2日 17:27

答案

  • 放到HttpContext.Current.Items里面去,Request结束的时候dispose掉。

    如果用ASP.net MVC的话,在controller的Dispose实现里面一起dispose掉。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年10月2日 19:35
    版主
  • 在多线程的时候,会容易造成 "已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"

     

    尽量在实际使用DataReader的地方,比如取单条数据的时候,使用using

     

    IQuaryable没有提供tolist的方法,可以把接受的方法体 换成IList,tolist可以把数据一次提交到内存,即使使用using也可以获取到数据,而且不会出现异常

    2010年10月3日 9:09

全部回复

  • 放到HttpContext.Current.Items里面去,Request结束的时候dispose掉。

    如果用ASP.net MVC的话,在controller的Dispose实现里面一起dispose掉。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年10月2日 19:35
    版主
  • 在多线程的时候,会容易造成 "已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"

     

    尽量在实际使用DataReader的地方,比如取单条数据的时候,使用using

     

    IQuaryable没有提供tolist的方法,可以把接受的方法体 换成IList,tolist可以把数据一次提交到内存,即使使用using也可以获取到数据,而且不会出现异常

    2010年10月3日 9:09
  • 哦,知道了,谢谢两位的热心解答,非常感谢!

    2010年10月3日 14:42
  • 这里我还想再继续问一下,对于将 ObjectContext 放到 HttpContext.Current.Items 中的这种方式,具体怎么放进去呢?在什么时候?应用程序启动的时候?

    2010年10月3日 14:46
  • 在创建ObjectContext的时候

    以后要用的时候检查httpcontext里面有没有,有的话就不用重新创建



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年10月3日 14:48
    版主