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

Nic*_*IOT 3 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"文件夹?

Wou*_*ort 5

答案是你提到的两种设计模式.

存储库是一种设计模式,可帮助您创建数据的单一访问点.例如其中有样功能的CustomerRepository GetById(int customerId),Update(Customer customer),Delete(Customer customer)Add(Customer customer)和,这取决于你的执行模式,用于处理涉及客户资料其他更具体的功能的特定风味.

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

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

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

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

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

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