我想在我的WPF应用程序中公开一个导航窗格,它显示数据库中的所有不同对象,每个对象都有子对象。每个孩子都可以有更多的孩子,并且可以有任意数量的级别(在实践中,这很可能限制在5个级别)。
为了加载这些项目及其相关的子项目,我尝试了以下方法:
public class DataModel
{
public ObservableCollection<Project> Projects {get;set;} //Will implement INotifyPropertyChanged here
public void LoadAllProjects()
{
using (var context = new Context())
{
context.Projects.Load();
this.Projects = context.Projects;
}
}
}
如上所述,上面的每个项目都会有子项目(可能有更多的子项目)。可以想象,当我试图在WPF前端展开NavigationTree时,上面的代码不起作用,并给出了“上下文已被释放”的异常。如何在导航树中公开这些属性,以便每当用户在NavigationTree中展开项目(或子项目)时加载这些属性?
理想情况下,我希望这个链接是“实时的”,也就是说,当在数据库中进行更改时,它们会显示在这个NavigationTree中(该应用程序将支持多个用户,他们可以同时在同一个数据库中处理同一个项目/不同的项目)。
这是单例上下文()实例的用例吗?
发布于 2015-11-25 12:27:23
作为解决此错误的快速解决方案,尝试使用ObservableCollection构造函数而不是分配。在构造函数中,它将将所有元素复制到新集合中,因此视图模型将独立于DbContext:
this.Projects = new ObservableCollection(context.Projects);
要决定如何在应用程序中使用DbContext,请看一篇非常好的文章:使用实体框架6正确地管理DbContext :深度指南。
其主要思想是在业务事务范围内保持DbContext活动。作者还提供了特殊的DbContextScope类来定义可以使用DbContext的业务事务边界。
https://stackoverflow.com/questions/33914861
复制相似问题