C# 与ViewModels共享EntityFramework上下文

C# 与ViewModels共享EntityFramework上下文,c#,wpf,entity-framework,mvvm,C#,Wpf,Entity Framework,Mvvm,我使用EF 6.1 alpha和Caliburn.Micro 2.0-alpha 我有一个名为ProductWorkspaceViewModel的视图模型,其中包含一个ProductViewModel。 这两个ViewModel都使用EF和各自的上下文,而第一个ViewModel从Db读取所有产品并将其显示在列表中,然后对所选项目执行CRUD操作 现在,当我从ProductViewModel中删除、添加或更新产品时,它应该在ProductWorkSpaceViewModel中得到更新。我使用Ev

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

我有一个名为ProductWorkspaceViewModel的视图模型,其中包含一个ProductViewModel。 这两个ViewModel都使用EF和各自的上下文,而第一个ViewModel从Db读取所有产品并将其显示在列表中,然后对所选项目执行CRUD操作

现在,当我从ProductViewModel中删除、添加或更新产品时,它应该在ProductWorkSpaceViewModel中得到更新。我使用EventAggregator更新工作区,并使用LoadAll()或将更新ProductEntity发送到WorkSpaceViewModel。但是,当我从工作区中选择相同的更新产品时,ProductViewModel中的延迟相关属性不会更新,因为它们都具有不同的上下文实例

我想为这两个ViewModel使用一个共享上下文,但我已经阅读了其他问题,比如上下文不应该被共享,应该在操作完成后尽快处理,比如delete

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

我应该使用共享上下文还是使用加载的所有惰性属性更新任一ViewModel。但这将增加更多的代码,而且很复杂

寻找最佳实践

Upate: 我刚才提到DbContext供参考,我使用了一个DAL,它有一个从DbContext继承的类


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

最佳做法是,您的
视图模型不直接使用实体框架或其
数据上下文,而是有一个数据访问层,负责所有数据库操作,您的虚拟机应使用服务提供商与DAL通信

事实上,您甚至不应该在主项目中引用实体框架,而应该只在DAL类库中引用实体框架


在您的虚拟机中,您应该使用
Product
类的
observedcollection
,并且您的两个虚拟机都应该在父子模式下使用相同的
observedcollection
,在这种情况下,您对
ProductViewModel
中的
产品所做的任何更改都会立即影响您的应用
ProductWorkspaceViewModel

最佳做法是,您的
ViewModel
不直接使用实体框架或它的
DataContext
s,而是有一个负责所有DB操作的数据访问层,您的虚拟机应该使用服务提供商与您的DAL通信

事实上,您甚至不应该在主项目中引用实体框架,而应该只在DAL类库中引用实体框架


在您的虚拟机中,您应该使用
Product
类的
observedcollection
,并且您的两个虚拟机都应该在父子模式下使用相同的
observedcollection
,在这种情况下,您对
ProductViewModel
中的
产品所做的任何更改都会立即影响您的应用
ProductWorkspaceViewModel

请查看我的更新问题请查看我的更新问题