如何在ViewModels之间正确共享Entity Framework ContextObject?

时间:2011-12-03 19:41:10

标签: wpf entity-framework mvvm-light

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

到目前为止,我设法做我想要的(我使用MVVM灯):数据绑定,命令,eventToCommand ...我在1个VS项目中使用以下架构:1个用于Views的文件夹,1个用于ViewModels,1个用于实体定义。

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

如何在ViewModels之间共享EF ObjectContext?我读了一些关于存储库或UnitOfWork的内容,但我并没有真正想知道如何在我的情况下使用它。

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

1 个答案:

答案 0 :(得分:5)

答案在于您提到的两种设计模式。

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

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

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

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

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

This是一篇很好的文章,它展示了使用EF时Repository和UoW模式的实现方式的基础知识。

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