2016-09-28 71 views
1

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

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

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

试想以下情形:

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

当用户退出详细视图:

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

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

回答

5

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

这是EF团队:

用的Windows Presentation Foundation(WPF)或Windows窗体 工作时,每使用形式的上下文实例。这使您可以使用上下文提供的变更跟踪功能 。

我想推荐使用存储库模式与依赖注入(DI)。然后你不需要担心实例化和处置dbcontext。那些是自动的。

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

你的好文章:How to work with DbContext

另一个很好的文章,其中解释了如何基于与实体框架,IoC容器和依赖注入通用Repository模式实现解耦,单位可测试,N层架构。是的,这篇文章是针对MVC的。但是你可以使用这篇文章了解这种模式。

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

+0

为了澄清,我不是一个深化发展的WPF应用程序,但一个UWP之一。但是这不会改变我猜想的任何事情。 –

+0

是的,你是对的。没有区别。同样的模式也可以应用在那里:) – Sampath

1

有吨的文章和做题上,许多感谢名单,谷歌“的DbContext一生桌面应用程序”。此外,这本MSDN杂志可能会有所帮助,虽然他们讨论nHibernate的情况,但规则完全相同。

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

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

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

尽管这种管理会话生存期的风格被描述为每个表单的会话,但实际上您通常会按照发言人来管理会话。

至于“的DbContext的1个实例”,这也被评论有:

一种常见的不良做法与[...]桌面应用程序是有一个单一的全球会议对整个应用。

和原因在下面讨论。