【问题标题】:EF DbContext and WPF MVVM PagesEF DbContext 和 WPF MVVM 页面
【发布时间】:2017-02-25 00:41:54
【问题描述】:

我正在使用创建实体框架代码优先数据库的 WPF 应用程序。 我在尝试查找如何使用页面导航组织我的 DbContext 时遇到问题。本质上,我在获得有关如何使我的 Db 保持最新的建议,同时仍然拥有下面的菜单选项。 从技术上讲,我会尽可能地遵循 MVVM,但在时间压力下,我已经削减了一些角落,我愿意根据需要削减更多。

WPF MVVM 布局

MainWindow 包含一个堆栈面板,其中包含用于覆盖页面导航的按钮。 这创建了一个主要用于导航的侧边栏。 主窗口还包含一个显示页面的框架,并使用 NavigationService 来控制显示的内容。

每个页面都有自己的 ViewModel,其基类实例化一个新的 DbContext。

问题 当菜单栏用于导航时,它会创建一个新的页面实例。 前一个页面在卸载时会保存其 DbContext,但这是在菜单栏已经实例化新页面并因此实例化 DbContext 之后发生的。 所以基本上新页面是用旧数据打开的,然后前一个页面保存它的 dbcontext。

想法?

  • 我似乎找不到确保菜单栏导航的方法 强制保存已打开的任何现有 DbContext。
  • 一种糟糕的做法是在所有页面中而不是在框架级别的页面之外创建菜单栏的副本;但是这个 似乎不对。
  • 请记住,可以从其他页面和菜单栏导航到页面。有没有一种方法可以让每个页面在创建时都有一些指向父窗口按钮的链接。
  • 某种事件订阅?这样当一个按钮 单击它可以强制保存当前使用的 DbContext。

【问题讨论】:

    标签: c# wpf entity-framework mvvm dbcontext


    【解决方案1】:

    听起来您有两个交互不佳的问题。

    首先,如果您有多个视图模型指向相同的数据/模型,那么它们应该相互了解并进行相应的绑定。这应该发生在 ViewModel 层并且通过模型层(以避免奇怪的副作用)。通常,我会努力确保相同的 ViewModel 为相关模型的每个实例提供服务。当 ViewModel 代理数据更改时,需要通知更改的每个人都会收到更改通知(MVVM 的要点)。

    其次,上下文管理/持久性/共享总是一个棘手的问题,这至少是一个原因。一般来说,我更喜欢拨到持久性轴两侧的一个极点。即为每个读取和写入的数据生成一个新上下文(首先从数据库填充并保留更改,以便它可以确定更新与写入时插入)生成一个从第一次使用时持续存在的单个上下文/需要申请关闭。你走哪条路很大程度上取决于应用程序架构和期望。对于网络,我倾向于倾向于前者。对于 WPF,我倾向于后者。

    【讨论】:

    • 谢谢@Jacob。第二点,您如何使用 WPF 构建您的类来实现这一点,您能举个例子吗?
    • 如何做很大程度上取决于您的数据结构和使用情况。例如,如果您的数据对象自然地落入层次结构中,那么您的顶级对象可以管理持久性(这也成为保存命令的自然位置)。如果您有许多没有自然关系的不同对象(或者它们的关系是不可预测的),那么拥有一个管理对象来处理数据访问(以及上下文管理)可能会很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多