使用Entity Framework 6创建WPF应用程序。我有一个视图模型,其中包含类别列表和项目列表(在所选类别中)。当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();
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属性set方法引发LoadCurrentList()方法
这就是全部!添加ToList()或使用查询到数据库(而不是本地)没有帮助。我发现的唯一解决方案是创建内部List变量,在表单创建时读表,而不是向此内部变量发出请求,而不是DBContext。
这些添加物是否有意义?
答案 0 :(得分:2)
您遇到的问题归因于LINQ's deferred execution
。尝试更改您的查询,如
CurrentList = new ObservableCollection<T>(Context.Set<T>().Where(p => p.IsGroup == false).Where(m => m.ParentId == _currentCategory.Id).ToList());
使用.ToList()
方法。
答案 1 :(得分:0)
您可能希望稍微切换一下代码。尝试使用“using”块来包装EF上下文访问。对于其中一个,它会自动处理异常,除此之外,它会在您不再需要它时立即释放。
这样你也不会有任何人通过反射处理你的DbContext属性(这取决于你的项目也可能发生)。