2010-07-05 37 views
0

我有一些数据,我从数据库与linq检索数据的问题。 当我尝试访问数据时,我获得以下异常: System.ObjectDisposedException:ObjectContext的istance已被删除,无法再用于需要连接的操作。 这是代码:linq System.ObjectDisposedException

using (ProvaDbEntities DBEntities =  
    new ProvaDbEntities(Utilities.ToEntitiesConnectionString())) 

      { 
       ObjectQuery<site> sites = DBEntities.site; 

       IEnumerable<site> q = from site in sites 

             select site; 


       { 
        ObjectQuery<auction> auctions = DBEntities.auction; 

        IEnumerable<auction> q1 = from auction in auctions 

               where auction.site == this.Name 

               select auction; 

        IEnumerable<IAuction> res = q1.Cast<IAuction>(); 

        return res; 

      } 
     } 
     catch(Exception e) 
     { 
      throw new UnavailableDbException("[GetAuctions]" + e.Message); 
     } 

有人可以帮我吗? 坦克 法比奥

回答

2

是 - 你回来,这将是懒洋洋地评估结果 - 但你处置这将被用来获取结果的数据上下文的。

选项:

  • 负载结果热切,例如通过在结果上调用ToList
  • 不要处理上下文(我不知道实体框架中的情况;您可以在LINQ to SQL中避免这种情况,但它可能不是一个好主意在EF)的背景下
  • 处置,当你完成与数据

在这种情况下,我建议使用第一个选项 - 这将是安全和简单。由于您已经在筛选结果,因此无论如何您都要投入IEnumerable<IAuction>,因此您不可能早日实现查询的正常缺点。 (如果它仍然是IQueryable<T>,那么你会丢掉向查询添加额外位的能力,并且它们仍然会被转换为SQL。)

+0

嗨,Jon, 我尝试过firf选项,但是我obeined an invalidCastException .. 你的意思是这样的吗? // IEnumerable res = q1.Cast (); IEnumerable res2 = q1.ToList()。Cast (); return res2; – trifabbio 2010-07-10 18:02:27

+0

@trifuge:不完全 - 你不需要再次调用Cast。但是如果你得到一个转换异常,这表明如果'IAuction'创建的对象不是实现。 – 2010-07-11 06:40:25

+0

是我(你:) :)在这里解决相同的问题 http://stackoverflow.com/questions/3075393/how-to-cast-list-to-enumerable .. 我很困惑:( – trifabbio 2010-07-11 16:34:39