В моем основном Window1.xaml.cs я создаю ObservableCollection ViewModels , например, путем создания экземпляра объекта модели LINQ-to-SQL:
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 для себя и отображаю все свойства из Model в 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;
...
}
и затем при обработке моих событий, таких как кнопка Save
, я мог бы просто вызвать SubmitChanges()
для внутренней переменной Db
, не восстанавливая ее, и снова получить данные из базы данных.
Так что мне кажется, что я должен либо (1) передать объект контекста уровня данных в ViewModel, который не выглядит как чистый MVVM способ решения этой проблемы, либо (2) мне нужно refetch мой объект LINQ-to-SQL каждый раз, когда я хочу сохранить объект модели, который уже был сохранен внутри, во ViewModel.
Какой самый чистый подход MVVM для решения этой дилеммы?