Когда я пишу такого рода программное обеспечение, мои виртуальные машины никогда не имеют никакого отношения к модели данных. Когда вы соединяете их таким образом, вы в значительной степени женаты на простом двухуровневом решении, которое может быть действительно сложным.
Если вы полностью отключите DataContext от своей виртуальной машины, и они будут работать самостоятельно, ваше приложение станет:
- Гораздо более тестируемый - ваши виртуальные машины могут быть протестированы без datacontext
- Потенциально не сохраняя состояния на уровне данных - легко изменить вашу архитектуру для принятия 3-уровневого решения без сохранения состояния.
- Возможность простой интеграции других источников данных - ваши виртуальные машины могут элегантно содержать агрегаты и комбинации других источников данных самостоятельно.
Короче говоря, да, я бы рекомендовал отделить классы доступа к данным от объектов ViewModel во всем приложении. Это может быть немного больше кода, но это принесет дивиденды в будущем с гибкостью архитектуры.
РЕДАКТИРОВАТЬ: Я не использую функции отслеживания изменений объектов L2SQL после того, как они пересекли границу распределения. Это довольно быстро превращается в банку с червями - вы можете тратить много времени на заботу и подачу графов объектов вашей модели данных внутри вашей модели представления - что не только усложняет ViewModel, но, по крайней мере, транзитивно связывает ViewModel с схема базы данных. Вместо этого я делаю ViewModel чистым. Когда придет время их сохранения, ваш сервисный уровень / репозиторий / что угодно выполняет преобразование между ViewModel и объектами данных. Сначала это кажется большой работой, но для всего, кроме простого CRUD, этот дизайн окупается довольно быстро.