实体框架:全局导航树

本文关键字:导航 全局 框架 实体 | 更新日期: 2023-09-27 18:24:12

我想在我的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时,就会出现"上下文已被处理"异常。如何在导航树中公开这些属性,以便每次用户在导航树上展开项目(或项目子项)时都加载这些属性?

理想情况下,我希望这个链接是"实时"的,即当在数据库中进行更改时,它们会显示在导航树中(该应用程序将支持多个用户,他们可以同时在同一数据库中处理同一项目/不同项目)。

这是singleton Context()实例的用例吗?

实体框架:全局导航树

作为此错误的快速解决方案,请尝试使用ObservableCollection构造函数而不是赋值。在构造函数中,它会将所有元素复制到新的集合中,因此您的视图模型将独立于DbContext:

this.Projects = new ObservableCollection(context.Projects);

要决定如何在应用程序中使用DbContext,请参阅一篇非常好的文章:使用实体框架6以正确的方式管理DbContext:深入指南。

其主要思想是在业务事务范围内保持DbContext的活力。作者提供了特殊的DbContextScope类来定义可以使用DbContext的业务事务边界。