我正在学习EF4.1和MVVM,在其中一个教程中,他们创建了一个MainWindowViewModel,它带有一个Repository对象,用于调用另一个视图模型(EmployeeListViewModel)。这是代码:
public MainWindowViewModel()
{
IObjectContextAdapter adapter = ((IObjectContextAdapter)new SidekickEntities());
_vmRepository = new GenericRepository(adapter.ObjectContext);
EmployeeListViewModel viewModel = new EmployeeListViewModel(_vmRepository);
this.ViewModels.Add(viewModel);
}
public EmployeeListViewModel(GenericRepository repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
_employeeRepository = repository;
this.AllEmployees = new ObservableCollection<Employee>(_employeeRepository.GetAll<Employee>());
}
我想知道的是,为什么在MainWindowViewModel中创建存储库然后传递给EmployeeListViewModel?为什么不在EmployeeListViewModel中创建存储库,如下所示:
public MainWindowViewModel()
{
EmployeeListViewModel viewModel = new EmployeeListViewModel();
this.ViewModels.Add(viewModel);
}
public EmployeeListViewModel()
{
IObjectContextAdapter adapter = ((IObjectContextAdapter)new SidekickEntities());
_employeeRepository = new GenericRepository(adapter.ObjectContext);
this.AllEmployees = new ObservableCollection<Employee>(_employeeRepository.GetAll<Employee>());
}
我对EF很新,但在每个单独的ViewModel中创建一个存储库似乎更清晰一些。当相关的ViewModel不再使用而不是保持它直到关闭MainWindowViewModel或者这会创建太多的存储库实例时,是否不会清理存储库?
答案 0 :(得分:0)
为每个ViewModel使用单独的Context时遇到的问题是,彼此链接的实体来自不同的上下文,因此您在尝试更新某些内容时必须手动解决此问题(请参阅{{3} })
这与称为工作单位的模式有关。
UoW帮助您封装应该协同工作的功能。在您的情况下,ObjectContext实现UoW模式,并在构造函数中传递给存储库。
您应该在可以协同工作的函数之间共享ObjectContext,并且应该将其视为一个工作单元。