I am in the middle of a \"discussion\" with a colleague about the best way to implement the data layer in a new application.
One viewpoint is that the data layer should
Old post but searching for similar information I came across this which explains it nicely.
Check out Linq to SQL, if I were creating a new application right now I would consider relying on an entirely Linq based data layer.
Other than that I think it's good practise to de-couple data and logic as much as possible, but that isn't always practical. A pure separation between logic and data access makes joins and optimisations difficult, which is what makes Linq so powerful.