使用ViewModels共享EntityFramework上下文

时间:2014-01-10 22:49:56

标签: c# wpf entity-framework mvvm

我使用EF 6.1 alpha和Caliburn.Micro 2.0 -alpha2。

我有一个名为ProductWorkspaceViewModel的ViewModel,它包含一个ProductViewModel。 这两个ViewModel都使用EF和各自的Context,而第一个从Db读取所有产品并在列表中显示它们,后来对所选项目进行CRUD操作。

现在,当我从ProductViewModel删除,添加或更新产品时,它应该在ProductWorkSpaceViewModel中更新。我使用EventAggregator更新Workspace,并使用LoadAll()或将更新ProductEntity发送到WorkSpaceViewModel。但是当我从Workspace中选择相同的更新产品时,在ProjectViewModel中不会更新Lazy的相关属性,因为它们都有不同的Context实例。

我想到为这两个ViewModel使用共享上下文,但是已经读过其他问题,比如上下文不应该被共享,应该在操作完成后立即处理,如删除。

如何才能最好地解决上述问题。许多DataTemplates也使用了工作区上下文。

我应该使用共享上下文还是应该在加载了所有Lazy Properties的情况下更新ViewModel。但这会增加更多代码并且很复杂。

寻找最佳实践。

Upate: 我刚刚提到DbContext供参考,我使用的DAL有一个继承自DbContext的类。

此外,我想更新我的主项目不使用EF或任何DAL。它充当我作为Sub Project创建的所有模块的主机。例如,ProductViewModel是Inventory Module的一部分,我使用IoC(MEF)加载到Main.exe中

1 个答案:

答案 0 :(得分:4)

最佳做法是让您的ViewModel不要直接使用实体框架或DataContext,而是使用数据访问层来代替所有数据库操作,而您的虚拟机应该使用服务提供商与您的DAL进行通信。

事实上,您甚至不应该在主项目中引用Entity Framework,而只能在DAL类库中引用

在您的虚拟机中,您应该使用ObservableCollectionProduct类,并且您的虚拟机应该在父子模式下使用相同的ObservableCollection,在这种情况下,您对其进行任何更改Product中的ProductViewModel会立即影响您的ProductWorkspaceViewModel