我将Calibre.Micro 2.0 -alpha2与EF 6.1 alpha一起使用。
我有一个名为ProductWorkspaceViewModel的ViewModel,其中包含一个ProductViewModel。
这两个ViewModel都使用带有各自上下文的EF,而第一个ViewModels从db中读取所有Product并将其显示在列表中,随后对所选项目执行CRUD操作。
现在,当我从ProductViewModel删除,添加或更新产品时,它应该在ProductWorkSpaceViewModel中得到更新。我使用EventAggregator更新工作区,并使用LoadAll()或将更新的ProductEntity发送到WorkSpaceViewModel。但是,当我从工作区中选择相同的更新产品时,由于Lazy的相关属性都具有不同的Context实例,因此不会在ProductViewModel中对其进行更新。
我认为要为这两个ViewModel使用共享的Context,但是已经阅读了其他问题,例如不应共享Context,并且应在操作完成后(如删除)立即处置Context。
我怎样才能最好地解决上述问题。此外,许多数据模板都使用工作区上下文。
我应该使用共享的上下文,还是更新所有已加载的惰性属性的ViewModel。但这将增加更多代码,并且很复杂。
寻找最佳实践。
更新:
我刚刚提到了DbContext作为引用,我使用的DAL具有从DbContext继承的类。
另外,我想更新主项目不使用EF或任何DAL。它充当了我作为子项目创建的所有模块的宿主。例如,ProductViewModel是库存模块的一部分,我使用IoC(MEF)将其加载到Main.exe中
最佳答案
最佳实践是让ViewModel
不直接使用Entity Framework或DataContext
,而是拥有一个负责所有DB操作的数据访问层,并且您的VM应使用服务提供商与DAL进行通信。
实际上,您甚至不应该在主项目中引用 Entity Framework ,而应仅在DAL类库中引用
在您的VM中,您应该使用ObservableCollection
类的Product
,并且两个VM都应在“父子”模式下使用相同的ObservableCollection
,在这种情况下,您对Product
中的ProductViewModel
所做的任何更改都会立即影响ProductWorkspaceViewModel
。
关于c# - 与ViewModels共享EntityFramework上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21055914/