linq System.ObjectDisposedException

linq System.ObjectDisposedException,linq,dispose,entities,Linq,Dispose,Entities,我用linq从db中检索到的一些数据有问题。 当我尝试访问数据时,我获得以下异常: System.ObjectDisposedException:ObjectContext的istance已删除,无法再次用于需要连接的操作。 代码如下: using (ProvaDbEntities DBEntities = new ProvaDbEntities(Utilities.ToEntitiesConnectionString())) {

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

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);
        }
使用(ProvaDbEntities DBEntities=
新ProvadBenties(Utilities.ToEntitiesConnectionString())
{
ObjectQuery sites=DBEntities.site;
IEnumerable q=来自站点中的站点
选址;
{
ObjectQuery auctions=DBEntities.auction;
IEnumerable q1=来自拍卖中的拍卖
其中auction.site==this.Name
选择拍卖;
IEnumerable res=q1.Cast();
返回res;
}
}
捕获(例外e)
{
抛出新的UnavailableDbException(“[GetAuctions]”+e.Message);
}
有人能帮我吗??? 坦克
Fabio

是-您返回的结果将被延迟评估-但您正在处理用于获取结果的数据上下文

选项:

  • 急切地加载结果,例如在结果上调用
    ToList
  • 不要处理上下文(我不知道实体框架中的情况如何;在LINQ to SQL中,您可以不受影响,但在EF中这可能不是一个好主意)
  • 处理完数据后,请处置上下文

在这种情况下,我建议使用第一种选择——它既安全又简单。由于您已经在筛选结果,并且您正在强制转换为
IEnumerable
,因此您不太可能获得提前实现查询的正常缺点。(如果它仍然是
IQueryable
,那么您就失去了向查询中添加额外位并将其转换为SQL的功能。)

嗨,Jon,我尝试了firf选项,但得到了一个invalidCastException。。你是说像这样的人//IEnumerable res=q1.Cast();IEnumerable res2=q1.ToList().Cast();返回res2@特里法比奥:不完全是这样-你不需要再次调用
Cast
。但是,如果您得到一个强制转换异常,这表明正在创建的对象不是实现,如果
IAuction
。这与我(您:)在这里解决的问题相同。。我很困惑:(嗨,乔恩,我还在这里被封锁..现在的情况是:如果我做了IEnumerable res=q1.Cast();我有一个异常,因为ObjectContext已被删除。如果我将结果转换为列表,我会有一个异常,因为NET 3.5或更低版本-不支持通用协方差。请回答Fabio@trifabbio:将其转换为列表,然后调用
Cast
。您可以在以后的任何时候执行该转换,因为数据已经被捕获到那时,我已经准备好了。