2009-12-26 2 views
2

В моем главном Window1.xaml.cs я строй ObservableCollection из ViewModels, как это, инстанцирования с LINQ-to-SQL модели объектом:Пропускает L2S DataContext в конструктор ViewModel, очищающий MVVM?

using (var db = Datasource.GetContext()) 
{ 
    var customers = from c in db.Customers 
        select c; 

    foreach (var customer in customers) 
    { 
     CustomerCollection.Add(new CustomerModelView(customer)); 
    } 
} 

В конструкторе каждого ViewModel, я сохранить объект LINQ-to-SQL внутренне и отобразить все свойства от модели к ViewModel:

#region ViewModelProperty: Customer 
private Customer _customer; 
public Customer Customer 
{ 
    get 
    { 
     return _customer; 
    } 

    set 
    { 
     _customer = value; 
     OnPropertyChanged("Customer"); 
    } 
} 
#endregion 

#region ViewModelProperty: FirstName 
private string _firstName; 
public string FirstName 
{ 
    get 
    { 
     return _firstName; 
    } 

    set 
    { 
     _firstName = value; 
     OnPropertyChanged("FirstName"); 
    } 
} 
#endregion 

... 

public CustomerViewModel(Customer customer) 
{ 
    Customer customer; 
    FirstName = customer.FirstName; 
    ... 
} 

проблема заключается в том, что при обработке событий в моей ViewModel, например, после того, как пользователь изменит какое-либо из полей и нажмет кнопку Save, мне нужно: восстановить объект объект LINQ-to-SQL, чтобы сохранить изменения, которые требуют больше трафика в базу данных и из нее, когда у меня уже был объект сохраняются внутри:

using (var db = Datasource.GetContext()) 
{ 
    var customer = (from c in db.Customers 
       where c.Id == Id 
       select c).SingleOrDefault(); 

    customer.FirstName = FirstName; 
    db.SubmitChanges(); 
} 

непосредственным решение передать LINQ-to-SQL DataContext объект до ViewModel, а при инстанцировании ViewModel, как это:

public CustomerViewModel(Customer customer, DataClasses1DataContext db) 
{ 
    Customer = customer; 
    Db = db; 

    FirstName = customer.FirstName; 
    ... 
} 

, а затем, когда обработка моих событий s uch как кнопка Save, я мог бы просто позвонить SubmitChanges() на внутренняяDb переменная, не восстанавливая ее и снова получая данные из базы данных.

Так что, кажется, я должен либо (1) передать контекст datalayer объекта в ViewModel, который не кажется, как чистого MVVM пути решения этой проблемы, или (2) я должен refetch мои LINQ to-SQL каждый раз, когда я хочу сохранить объект модели, который я уже сохранил внутренне в ViewModel.

Каков самый чистый подход MVVM для решения этой дилеммы?

ответ

2

Это означает, что ваш ViewModel имеет знания о datalayer. Я думаю, что лучше использовать контекст инициализатора объекта. Это также позволяет сделать это:

using (var db = Datasource.GetContext()) 
{ 
    var customers = from c in db.Customers 
        select new CustomerModelView 
        { 
         Name = c.Name; 
         Address = c.Address; 
        }; 

    CustomerCollection.AddRange(customers); 
} 

При обновлении базы данных, вы должны быть в состоянии создать новый объект, а затем использовать db.AttachObject, чтобы контекст знать об этом. Это избавит вас от необходимости повторно извлекать его из базы данных только для его изменения.

+0

+1 для прикрепления. Это правильный подход. Имейте ViewModels, чтобы сохранить объект модели в свойстве Model и просто использовать attach при круговом отключении. –

+0

@ Андерсон: Я не думаю, что привязка объекта модели к viewmodel - хорошая идея на самом деле. Он не получает сериализованности назад, когда круговое отключение истинно на странице, и это также вводит плотную связь двух. Viewmodel должен просто содержать данные, не более того. –

+0

Это * View ** Model * Это точка. Оба слова важны здесь. Я видел, как многие люди вводили новую конструкцию, такую ​​как контроллер, который действует как смазочный слой между моделью просмотра и моделью, но я бы не счел это обязательным. –

Смежные вопросы