2013-03-26 5 views
0

В настоящее время я пишу свое первое приложение MVVM, которое использует EntityFramework для доступа к данным. Приложение в значительной степени опирается на базовую базу данных и во многих случаях должно добавлять новые данные в БД.ObjectContext в ViewModel (EF + MVVM)

Тем не менее, я не уверен, есть ли идея вызвать ObjectContext внутри ViewModel. , например.

public class SomeViewModel : ViewModelBase 
{ 
    public IEnumerable<User> AllUsers { get; private set; } 

    private void SomeMethod() 
    { 
     var __entities = new DatabaseEntities(); 
     AllUsers = __entities.Users.Where(...).ToList(); 
    } 

}

Я видел решения, как это, но есть какой-то вопрос, поставляемая вместе с ним. Например, как долго ObjectContext на самом деле живет, или если вы предпочитаете единый глобальный доступный ObjectContext.

Или должны звонить, как те, которые не являются частью виртуальной машины в первую очередь? В настоящее время я также могу представить, как реализовать StaticHelpers для каждой таблицы DB и использовать такие методы, как GetAllUsers().

В примере приложения Джоша Смита о MVVM он использует репозиторий, который вводится в конструктор каждой виртуальной машины.

public AllCustomersViewModel(CustomerRepository customerRepository) 

Несмотря на то, что это должно быть общей проблемой, я не нашел удовлетворительного ответа на этот вопрос, как при подходе для небольших приложений (лучшие практики)?

+0

Я думаю, что вызов ObjectContect непосредственно из метода в вашей модели просмотра означает, что если у вас нет хорошего метода GetAllUsers(), к которому можно получить доступ с помощью другой viewmodel (при необходимости). Если у вас нет такого требования, я думаю, что все в порядке. Вы можете обернуть создание экземпляра DatabaseEntities при использовании. Я думаю, что проблема, с которой вы столкнетесь с текущим рабочим процессом, - это управление обновлениями пользовательского интерфейса. Во-первых, вы используете IEnumerable вместо ObservableCollection , во-вторых, вы используете класс пользователя EF напрямую, а не обертываете его в виртуальную машину, которая реализует INPC. – failedprogramming

ответ

2

В дескрипторе класса DbContext в MSDN он содержит "Represents a combination of the Unit-Of-Work and Repository patterns", поэтому он может действовать как ваш уровень хранилища, хотя это не обязательно, и он предназначен для использования в «Единице работы», которая не работает Не используйте глобальную для всего приложения. Кроме того, чтобы поддерживать один, потому что все может вызвать проблемы с кэшированными данными и другими нежелательными вещами (использование памяти и т. Д.).

Надеюсь, это поможет.