打开必须先关闭的DataReader

时间:2014-02-17 12:24:53

标签: c# sql-server entity-framework

  • NET 4.5

当我部署到生产服务器并在foreach中遍历位置时,我得到上述错误(主题行)。为了让它在生产服务器上工作,我必须转换为一个数组,即 var locationArray = locations.ToArray(); 并迭代 locationArray

所以我的问题是在TEST中(在VS2013中调试时运行本地)我正在针对SQLExpress实例运行而在PRODUCTION中我正在运行一个完全成熟的SQLServer。但是,为什么迭代位置不会在TEST中产生错误,但在PRODUCTION中会这样做?

public IQueryable<State> StatesInCountryGet(long aCountryId)
{
    List<State> result = new List<State>();

    using (DataRepository dataRepository = DataRepository.Instance())
    {
        //#TODO: Find a better way to do a GROUP BY
        IQueryable<LocationsMapping> locations = dataRepository.Query<LocationsMapping>(r => r.CountryId == aCountryId);

        var locationArray = locations.ToArray();  //Why do I need to do this?
        foreach (LocationsMapping locationMapping in locationArray)
        {
            //Add the state if we don't have it already
            if (!result.Exists(r => r.Id == locationMapping.StateId))
            {
                result.Add(locationMapping.State);
            }
        }
    }
    return result.AsQueryable();
}

1 个答案:

答案 0 :(得分:2)

不同的数据库版本具有不同的功能,ORM等工具通常会将其代码定制到特定平台以利用功能差异。因此,测试一个非常不同的版本是一个真的坏主意。我强烈建议您针对开发人员版本进行开发。

调用ToArray()会强制立即完全评估迭代(到序列的末尾)。这实际上是一个非常常见的事情,可以避免在一个连接上同时使用读者。

至于为什么:也许你在一个而不是另一个上启用Multiple Active Result Sets(MARS);或者它可能知道MARS在快递上永远不会,所以不要尝试 - 但它认为MARS 可能在完整的SQL Server上可用,所以尝试使用它