【问题标题】:How to share properly Entity Framework ContextObject between ViewModels?如何在 ViewModel 之间正确共享实体框架 ContextObject?
【发布时间】:2011-12-03 19:41:09
【问题描述】:

我是 WPF/MVVM/Entity Framework 的新手,需要同时处理很多概念。 我正在创建一个只有一个主视图的 WPF 应用程序,它分为两部分:1 个用户控件用于我的数据的主视图,另一个用户控件用于详细视图。所有数据都存储在通过 Entity Framework 实体模型生成的数据库中。

到目前为止,我设法做我想做的事(我使用 MVVM light):数据绑定、命令、eventToCommand... 我在 1 个 VS 项目中使用以下架构:1 个文件夹用于视图,1 个用于 ViewModel,1 个用于实体定义.

我使用 MVVM Light Messaging 将数据从 master 传递到 detail userControl,当我尝试更新一个实体时,遇到异常告诉我无法更新,因为我尝试更新链接到 ObjectContext 的一个对象(在MasterViewModel) 与一个对象来自另一个对象(在DetailedViewModel 中声明)

如何在 ViewModel 之间共享 EF ObjectContext? 我阅读了一些关于存储库或 UnitOfWork 的资料,但我并没有真正了解如何在我的案例中使用它。

辅助问题:使用 EF 和 n 层应用访问实体的最佳做法是什么?存储库是答案吗?考虑到类已经存在这一事实,我的解决方案架构中是否应该有一个“模型”文件夹?

【问题讨论】:

  • 您是否忘记接受下面的答案(这会提高您的声誉)或者您是否在寻找其他解释? :)

标签: wpf entity-framework mvvm-light


【解决方案1】:

答案就在你提到的两种设计模式中。

存储库是一种设计模式,可帮助您创建数据的单一访问点。例如一个 CustomerRepository,它具有 GetById(int customerId)Update(Customer customer)Delete(Customer customer)Add(Customer customer) 等函数,并且根据您实现该模式的特定风格,还有其他更具体的函数用于处理涉及客户的数据。

在常规应用程序中,您将拥有几个存储库,可让您访问不同类型的数据。然后,在业务功能中,您将使用其中一些存储库来构建功能。

然后出现了 UnitOfWork 模式,因为它可以帮助您将一组相关操作分组。工作单元会跟踪更改,直到您将它们作为一个整体保存到数据库中。 (EF中的ObjectContext是UoW模式的实现)

在您的示例中,显示了一个主表单,然后加载和更新其中一个项目的详细信息,是一组您想要一起更新的相关操作。

这意味着您应该为主视图和详细视图使用一个 UoW。

This 是一篇不错的文章,它展示了在使用 EF 时如何实现存储库和 UoW 模式的基础知识。

Here 你可以找到 Repository 模式的解释和工作单元的here (这些参考都来自企业应用程序模式,如果你想了解更多,这是一本非常好的书)

【讨论】:

  • 您好 Wouter,非常感谢您的回答。我会尝试你给我的每首曲目,如果需要,我会提出补充问题。再次感谢!
  • 您好,我实现了 repos 和 UnitOfWork,例如 the example kindly given by Wouters
  • 另见ef4templates.codeplex.com,它有一个 t4 生成器,用于从 .edmx 文件生成存储库和所有数据模型,以便以这种方式使用。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2023-03-13
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
相关资源
最近更新 更多