【发布时间】:2009-12-26 19:50:04
【问题描述】:
在我的主 Window1.xaml.cs 中,我通过使用 LINQ-to-SQL 模型对象进行实例化,像这样构建 ObservableCollection of ViewModels:
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 的 constructor 中,我在内部保存 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();
}
直接的解决方案是在实例化 ViewModel 时也将 LINQ-to-SQL datacontext object 传递给 ViewModel,如下所示:
public CustomerViewModel(Customer customer, DataClasses1DataContext db)
{
Customer = customer;
Db = db;
FirstName = customer.FirstName;
...
}
然后在处理诸如Save 按钮之类的事件时,我可以在internal Db 变量上调用SubmitChanges() 而无需重新实例化它并再次从数据库中获取数据。
所以看来我必须(1)将数据层上下文对象传递到 ViewModel 中,这似乎不是解决此问题的 clean MVVM 方法,或者(2)我必须每次我想保存已经在 ViewModel 内部保存的模型对象时,重新获取我的 LINQ-to-SQL 对象。
解决这个困境的最简洁的 MVVM 方法是什么?
【问题讨论】:
标签: c# wpf linq-to-sql mvvm