Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mvvm 在哪里定义存储库?_Mvvm_Entity Framework 4.1_Repository - Fatal编程技术网

Mvvm 在哪里定义存储库?

Mvvm 在哪里定义存储库?,mvvm,entity-framework-4.1,repository,Mvvm,Entity Framework 4.1,Repository,我正在结合MVVM学习EF4.1,在其中一个教程中,他们创建了一个带有存储库对象的MainWindowViewModel,用于调用另一个视图模型EmployeeListViewModel。代码如下: public MainWindowViewModel() { IObjectContextAdapter adapter = ((IObjectContextAdapter)new SidekickEntities()); _vmRepository = new GenericRep

我正在结合MVVM学习EF4.1,在其中一个教程中,他们创建了一个带有存储库对象的MainWindowViewModel,用于调用另一个视图模型EmployeeListViewModel。代码如下:

public MainWindowViewModel()
{
    IObjectContextAdapter adapter = ((IObjectContextAdapter)new SidekickEntities());
    _vmRepository = new GenericRepository(adapter.ObjectContext);
    EmployeeListViewModel viewModel = new EmployeeListViewModel(_vmRepository);
    this.ViewModels.Add(viewModel);
}

我对EF很陌生,但在每个单独的ViewModel中创建一个存储库似乎更干净一些。当所讨论的ViewModel不再使用时,存储库不会被清理,而不是将其保留到MainWindowViewModel关闭之前,还是会创建太多存储库实例

为每个ViewModel使用单独的上下文时会遇到的问题是,具有彼此链接的实体来自不同的上下文,因此在尝试更新某些内容时必须手动解决此问题,请参见

这与称为工作单元的模式有关

UoW帮助您封装应该一起工作的函数。在您的例子中,ObjectContext实现UoW模式,并在构造函数中传递给存储库


您应该在一起工作的函数之间共享ObjectContext,并将其视为一个工作单元。

好的,谢谢。很高兴在我深入开发之前知道这一点!:
public EmployeeListViewModel(GenericRepository repository)
{

    if (repository == null)
    {
        throw new ArgumentNullException("repository");
    }

    _employeeRepository = repository;
    this.AllEmployees = new ObservableCollection<Employee>(_employeeRepository.GetAll<Employee>());
}
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>());
}