gpt4 book ai didi

c# - 在 ViewModel 中具有静态 DbContext 的 WPF 应用程序

转载 作者:行者123 更新时间:2023-12-03 10:17:29 25 4
gpt4 key购买 nike

我正在使用 MVVM、代码优先和存储库模式开发 WPF 应用程序。我需要一个后台任务,它处理来自客户端的网络服务器请求并将新数据保存到数据库中。

问题是每个 ViewModel 都有一个属性 (ObservableCollection),它获取 Repository.GetObservableCollection()。所以每个 ViewModel 都有一个存储库实例,它具有相同的 DbContext(所以我在保存复杂实体时不会得到 DbException)。这个 DbContext 是长期存在的,直到每个 repo 中的应用程序结束,并从 MainViewModel 注入(inject)到 VM 的构造函数中。

当我从后台任务将新数据保存到数据库时,GUI 不会更新,因为我在那里使用不同的 DbContext(由于并发请求,我必须这样做):

using (var db = new DbContextManager())
{
var client = new Client();
db.Client.Add(client);
db.SaveChanges();
}

有两种方法,我尝试过:
  • 在 MainViewModel 中设置 DispatcherTimer 以使用 ViewModel.Repository.LoadAll 为每个 repo 每 2 秒更新一次 ViewModel。这每 2 秒滞后一次我的 UI,但它可以工作。
  • 将新数据保存到数据库时,还要通过将实体添加到存储库。

    Application.Current.Dispatcher.Invoke
    (
    () =>
    {
    _clientRepository.Add(client);
    }
    );

  • 这样,实体立即出现在 GUI 中,但也有轻微的滞后(移动窗口时),我无法更新现有实体的属性。

    问题是我如何重构它以允许 GUI 和后台与实体交互。如何正确组合存储库和 MVVM?

    最佳答案

    不要直接将 ViewModel 实体与 DB DataContext 链接.
    您需要定义一个 ObservableCollection在 ViewModel 及其在 XAML 中的绑定(bind)。

    之后,您将通过从持久层调用函数来异步更新集合。所以你最好使用 LoadAsync ,或者您可以将您的数据库检索包装到一个任务中。这种方法会起作用,因为 await将捕获 SynchronizationContext UI 线程,并将在 UI 线程中更新您的组件。

    实际DataContext必须隐藏在该持久层中,并且必须保持 ViewModel 不知道。

    回复评论

    if I don't pass DbContext to the ViewModels (which in turn pass it to its Repository), how do I get the context to the repository, so I can call


    point void LoadAll() { 
    context.Set<T>().Load();
    }


    public ObservableCollection<T> GetObservableCollection() { 
    return context.Set<T>().Local;
    }

    根据我的回答,ViewModel 可以调用持久层函数来加载集合,(甚至不需要从持久层返回的类型是可观察的)。
    关键是你不会返回 void你可能会使用 LoadAsync这样你就可以 await当您将返回的数据分配给 ViewModel 属性的基础集合时。

    so I have to use Dispatcher.Invoke to interact with repos/viewmodels



    不,不要使用 Dispatcher.Invoke与存储库数据库上下文交互。使与数据库的交互异步。请注意 Dispatcher.Invoke仅适用于 用户界面 层。

    关于c# - 在 ViewModel 中具有静态 DbContext 的 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43014574/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com