获取值的方法是返回已处置的对象

时间:2014-11-20 22:17:01

标签: c# .net entity-framework

我有以下内容:

这是一个公共图书馆:

 public static IEnumerable<Attribute> GetImageDimensions(int mediaCategory, int platformId, AttributeType typeOfImage)
    {
        using (var db = new Entities())
        {
            var settingLanguage = typeOfImage.ToString();

            var attr = db.MediaCategoryImageDimensions.Where(
                id =>
                id.MediaCategoryId == mediaCategory &&
                id.PlatformId == platformId &&
                id.Attribute.Setting == settingLanguage).Select(dim => dim.Attribute).Include(s => s.Value);
            return attr;
        } 
    }

在另一个项目中进行以下调用:

 var expectedDimension = AttributeDAO.GetImageDimensions(
                                MediaCategoryDAO.GetMediaCategoryId(_objectToValidate.MediaCategory),
                                _airline.AirlinePlatforms.First().PlatformId,
                                AttributeType.RecommendedPreviewDimension);

我的问题是每次都得到一个返回值,表示枚举的结果是对象已被处理掉。

我也尝试将attr变量移到使用范围之外,认为这就是问题所在。

我很难理解为什么我的返回值是这个例外:

  

&#34;由于已经处理了DbContext,因此无法完成操作。&#34;

2 个答案:

答案 0 :(得分:3)

因为您要返回Linq表达式,所以查询将在处理完上下文后发生(deferred执行)

您需要删除using语句,并在从中提取所有信息后才处理上下文,或者在退出方法之前需要从查询中返回结果。

您可以在返回时调用return attr.ToList()以强制执行,但这可能会对性能产生负面影响,因为我们无法看到您正在执行的操作,但由于您在此范围内过滤结果可能是您的最佳选择。

答案 1 :(得分:2)

在返回attr对象之前调用ToList()。这将列举清单。

var attr = db.MediaCategoryImageDimensions.Where(
            id =>
            id.MediaCategoryId == mediaCategory &&
            id.PlatformId == platformId &&
            id.Attribute.Setting == settingLanguage).Select(dim => dim.Attribute).Include(s => s.Value).ToList();