使用 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/