【问题标题】:Good usage of DbContextDbContext 的良好使用
【发布时间】:2016-09-28 07:30:37
【问题描述】:

我正在使用 EntityFramework 创建我的第一个应用程序。我正在使用 Entity Framework Core 和 MVVMLight。

我创建了一个 DbContext 后代类。我想知道何时实例化这个 DbContext。

我的第一个想法是为每个视图创建一个实例。

想象以下场景:

  • 我有一个 Item 类
  • 我创建了一个 ItemsViewModel 来管理项目列表。在这个 viewModel 中,我为 DbContext 添加了一个属性
  • 当用户双击一个项目时,它会显示在与 ItemViewModel 关联的详细视图中。这个视图模型也有我的 DbContext 的一个实例。

当用户退出详细视图时:

  • 如果他保存了,我更新列表的DbContext
  • 如果他取消,则不必更新列表

这是一种正确的做事方式吗?我在某处读到应该只有 1 个 DbContext 实例。但在这种情况下,对详细视图的所有修改都会传播到列表视图,即使详细视图已被取消。

感谢聆听

【问题讨论】:

    标签: c# entity-framework mvvm entity-framework-core


    【解决方案1】:

    因此您正在开发 WPF 应用程序,您可以为每个表单使用一个上下文实例。

    这是来自 EF 团队:

    使用 Windows Presentation Foundation (WPF) 或 Windows 时 表单,每个表单使用一个上下文实例。这使您可以使用 上下文提供的更改跟踪功能。

    我想建议将存储库模式与依赖注入 (DI) 一起使用。这样您就不必担心 dbcontext 的实例化和处置。这些是自动的。

    因此,您使用的是 EF 核心,您可以使用 Autofac 作为 DI API。

    给你的好文章: How to work with DbContext

    另一篇很好的文章,它解释了如何基于具有实体框架、IoC 容器和依赖注入的通用存储库模式实现解耦、可单元测试的 N 层架构。是的,这篇文章是针对 MVC 的。但是您可以通过这篇文章很好地了解这种模式。

    Generic Repository and Unit of Work Pattern, Entity Framework,Autofac

    【讨论】:

    • 为了澄清,我不是在开发 WPF 应用程序,而是在开发 UWP 应用程序。但是我猜这并没有改变她的任何事情。
    • 是的,你是对的。没有区别。同样的模式也可以应用在那里:)
    【解决方案2】:

    关于“DbContext 生命周期桌面应用程序”的谷歌有大量文章和 SO 问题。此外,这本 MSDN 杂志可能会有所帮助,虽然他们讨论了 nHibernate 的案例,但规则完全相同。

    Data Access - Building a Desktop To-Do Application with NHibernate

    桌面应用程序的推荐做法是每个表单使用一个会话,以便应用程序中的每个表单都有自己的会话。每个表单通常代表用户想要执行的一项不同的工作,因此将会话生命周期与表单生命周期相匹配在实践中非常有效。额外的好处是您不再有内存泄漏的问题,因为当您关闭应用程序中的表单时,您也会处理会话。这将使会话加载的所有实体都有资格被垃圾收集器 (GC) 回收。

    更喜欢每个表单一个会话还有其他原因。您可以利用 NHibernate 的更改跟踪,因此它会在您提交事务时将所有更改刷新到数据库。它还在不同表单之间创建了隔离屏障,因此您可以提交对单个实体的更改,而不必担心对其他表单上显示的其他实体的更改。

    虽然这种管理会话生命周期的方式被描述为每个表单一个会话,但实际上您通常管理每个演示者的会话。

    至于“1 个 DbContext 实例”,这里也有注释:

    [...] 桌面应用程序的一个常见不良做法是为整个应用程序设置一个全局会话。

    下面会讨论原因。

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2018-08-27
      • 2012-04-01
      相关资源
      最近更新 更多