В прошлом, где я работал, мы создавали класс-оболочку для DataContext, который генерировал sqlmetal. Затем мы создали тонкий слой данных, который содержал приватный DataContext и все классы, сгенерированные sqlmetal.
Если для каких-либо операций в программном обеспечении требовалась информация из базы данных, они должны были пройти через этот слой-обертку, чтобы получить ее. Другими словами, LINQ to SQL не может появиться за пределами этого уровня данных.
Таким образом, всякий раз, когда нам приходилось перегенерировать классы через sqlmetal, только части уровня данных могли сломаться. Гораздо проще исправить один уровень, где весь код доступа к данным, чем изменить разбрызгивание LINQ to SQL по всей логике или области приложения.