Я думаю, что можно использовать сгенерированные классы моделей непосредственно на бизнес-уровне и уровне представления, однако я бы определенно инкапсулировал доступ к данным для этих объектов в шаблон хранилища некоторого описания (GetOne()
, Save()
, Search()
, Delete()
и т. Д.).
Основная причина для этого состоит в том, чтобы «отключить» результаты запроса перед возвратом их на вызывающий уровень, чтобы клиенты случайно не выполняли запросы непосредственно к базе данных, когда они используют LINQ для возвращаемых результатов. Например, вызов ToList()
для IQueryable<T>
вернет локальную копию последовательности, которой можно управлять с помощью простого LINQ to Objects.
Это также способствует лучшему разделению слоев и меньшей связности, так как клиенты будут взаимодействовать через интерфейсные методы в хранилище, а не использовать LINQ to SQL напрямую для доступа к данным, поэтому, если вы решите перебросить LINQ to SQL в пользу Entity Framework (вздрагивает), рефакторинг сделать проще.
Единственное исключение, которое я хотел бы сделать, - это когда объекты LINQ to SQL должны пересекать границу службы, т. Е. Отправляться как объекты передачи данных в службу WCF или из нее. В этом случае, я думаю, было бы неплохо иметь отдельную, легковесную объектную модель, которая поддерживает сериализацию - не посылайте ваши объекты LINQ to SQL напрямую по проводам.