Передает ли DataContext L2S в конструктор ViewModel чистый MVVM? - PullRequest
2 голосов
/ 26 декабря 2009

В моем основном 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 для решения этой дилеммы?

1 Ответ

2 голосов
/ 26 декабря 2009

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

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, чтобы контекст знал об этом. Это избавляет вас от необходимости повторно извлекать его из БД, просто чтобы изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...