DbContext的良好使用

本文关键字:DbContext | 更新日期: 2023-09-27 18:09:13

我正在使用EntityFramework创建我的第一个应用程序。我使用实体框架核心和MVVMLight。

我创建了一个DbContext子类。我想知道什么时候实例化这个DbContext。

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

想象下面的场景:

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

用户退出详细信息视图时:

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

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

非常感谢您的聆听

DbContext的良好使用

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

这是来自EF团队的

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

我建议使用依赖注入(DI)的存储库模式。然后,您不需要担心dbcontext的实例化和处置。这些都是自动的。

因此你使用EF core,你可以使用Autofac作为DI API。

如何使用DbContext

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

通用存储库和工作单元模式,实体框架,Autofac

有很多关于这个的文章和问题,谷歌一下" DbContext终身桌面应用程序"。此外,这个MSDN杂志可能会有所帮助,尽管他们讨论的是nHibernate的情况,但规则是完全相同的。

Data Access - using NHibernate构建桌面待办事项应用

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

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

虽然这种管理会话生命周期的方式被描述为每个表单一个会话,但在实践中,您通常管理每个presenter的会话。

对于dbcontext的"1"实例,这里也有注释:

一个常见的坏习惯…桌面应用程序是为整个应用程序提供一个全局会话。