Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取值的方法返回已释放的对象_C#_.net_Entity Framework - Fatal编程技术网

C# 获取值的方法返回已释放的对象

C# 获取值的方法返回已释放的对象,c#,.net,entity-framework,C#,.net,Entity Framework,我有以下资料: 这在公共库中: public static IEnumerable<Attribute> GetImageDimensions(int mediaCategory, int platformId, AttributeType typeOfImage) { using (var db = new Entities()) { var settingLanguage = typeOfImage.ToStrin

我有以下资料:

这在公共库中:

 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;
        } 
    }
我的问题是,每次我都会得到一个返回值,表示枚举的结果是对象已被释放

我还尝试将attr变量移到问题所在的范围之外

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

“无法完成该操作,因为DbContext已被释放。”


因为您返回的是
Linq
表达式,所以查询将在上下文被释放(执行)后发生

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


您可以在返回时调用
return attr.ToList()
,强制执行,但这可能会对性能产生负面影响,因为我们看不到您在做什么,但由于您在其中筛选结果,这可能是您的最佳选择。

因为您返回的是
Linq
表达式,查询将在上下文被释放(执行)后发生

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

您可以在返回时调用
return attr.ToList()
,以强制执行,但这可能会对性能产生负面影响,因为我们看不到您在执行什么,但由于您在其中筛选结果,因此这可能是您的最佳选择。

在返回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();
在返回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();

该上下文在该操作之前被释放。您有什么类型的应用程序?我倾向于使用Repository模式将数据内容的访问封装在工作单元中。您还可以将Entities对象作为类的成员保留,使其不处于disposed状态。您将需要通过最终调用Dispose来管理其生命周期。在此操作之前,上下文已被释放。您有什么类型的应用程序?我倾向于使用Repository模式将数据内容的访问封装在工作单元中。您还可以将Entities对象作为类的成员保留,使其不处于disposed状态。您将需要通过最终调用Dispose来管理它的生命周期这就是我最终要做的。有更好的方法吗?另一个调用会将一个未连接的对象返回到我的上下文中?这就是我最后要做的。有更好的方法吗?将未连接的对象返回到我的上下文的不同调用?