调用方法返回数据到控制器报错“DbContext已释放,无法完成操作”
错误根因
该报错由Entity Framework的延迟执行特性触发:你在using代码块中仅构造了LINQ查询的表达式树,并未实际执行查询加载数据。当using块执行结束后,DbContext会被自动销毁释放,后续接口返回结果要遍历IEnumerable<Tab>加载数据时,已经没有可用的DbContext来执行查询操作,因此抛出该异常。
修复方法
只需在using块内部的查询表达式末尾,调用立即执行方法将数据提前加载到内存即可,可选ToList()、ToArray()等方法。
修改后的DashboardActions.cs代码
public IEnumerable<Tab> GetTabs() { IEnumerable<Tab> recentPages = null; try { using (var context = new Clarity.BusinessLayer.CLARITY_DNN()) { recentPages = (from t in context.Tabs join tp in context.TabPermissions on t.TabID equals tp.TabID where tp.RoleID == -1 && tp.AllowAccess && tp.PermissionID == 3 && !t.IsDeleted && t.IsVisible && t.PortalID == 0 && !string.IsNullOrEmpty(t.Description) && t.TabName != "Home" select t) .OrderByDescending(p => p.LastModifiedOnDate ?? p.CreatedOnDate) .Take(20) .ToList(); // 新增此行,立即执行查询将数据加载到内存 } } catch (Exception e) { Console.WriteLine(e.Message); } return recentPages; }
额外注意
如果Tab类包含需要用到的导航属性,需要在查询时通过Include()方法预加载对应导航属性,或者关闭上下文的延迟加载开关,避免后续遍历导航属性时再次触发上下文已释放的错误。
内容的提问来源于stack exchange,提问作者jmath412
相关产品推荐
相关产品推荐

