c# - WPF+EF - 操作无法完成,因为 DbContext 已被释放

标签 c# wpf entity-framework

使用 Entity Framework 6 创建 WPF 应用程序。我有一个 View 模型,其中包含类别列表和项目列表(在选定的类别中)。当 selectedCategory 更改时,我使用以下方法来填充项目列表:

CurrentList = new ObservableCollection<T>(Context.Set<T>().Where(p => p.IsGroup == false).Where(m => m.ParentId == _currentCategory.Id));

我没有展示不同的错误处理等。所以我打开一个表单,选择类别,一切都很完美。如果多次关闭并打开同一个表单,则会出现异常:“操作无法完成,因为 DbContext 已被释放”。 有时我在第二次打开后得到它,有时-在第三次或第四次访问同一表格后得到它。 当表单关闭时上下文被释放。

我做错了什么,为什么这个异常不定期出现,而且从来不会在第一次打开时出现?

------UPD 1------ 好的,我正在向您展示更多代码,但我确定问题出在该行。

表单创建:

Context = new Entities();
Context.Set<T>().Load();
LoadCurrentList();

加载当前列表():

if ((CurrentCategory == null) || (CurrentCategory.Id == 0))
{
    CurrentList = new ObservableCollection<T>(Context.Set<T>().Local.Where(p => p.IsGroup == false).Where(m => m.Parent == null));
}
else
{
    CurrentList = new ObservableCollection<T>(Context.Set<T>().Local.Where(p => p.IsGroup == false).Where(m => m.ParentId == CurrentCategory.Id));
}

表单关闭命令:

Context.Dispose();

CurrentCategory 属性设置方法引发 LoadCurrentList() 方法

仅此而已!添加 ToList() 或使用数据库查询(而不是本地)没有帮助。我发现的唯一解决方案是创建内部 List 变量,在表单创建时读取表,然后向该内部变量发出请求,而不是向 DBContext 发出请求。

这些添加有意义吗?

最佳答案

您遇到的问题是由于LINQ的延迟执行造成的。尝试更改您的查询,例如

CurrentList = new ObservableCollection<T>(Context.Set<T>().Where(p => p.IsGroup == false).Where(m => m.ParentId == _currentCategory.Id).ToList());

使用.ToList()方法。

关于c# - WPF+EF - 操作无法完成,因为 DbContext 已被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24448854/

相关文章:

entity-framework - 卸载 Entity Framework Power 工具后,edmx 不再在设计器中打开

c# - SQL数据读取器读取不一致

c# - 从 XElement 获取子元素

c# - 如何使用 LINQ 从数据库设置自动完成功能?

c# - 锁定调度程序

mysql - 是否可以将 EntityFramework 与 MemSQL 一起使用?

c# - 当我运行我的网站时, GridView 没有出现

wpf - WPF 元素事件处理程序中的 UI 更新

wpf - 在 WPF 中使用 ObjectAnimationUsingKeyFrames 对 Control 的 'Style' 属性进行动画处理

c# - ASP 标识角色不存在错误