the main guide that I use when I am setting up a project structure is to ensure that I can add some operationcontract attributes to the business logic layer, and then host it as a wcf service.
If i can do this, that means the business logic layer has isolated my data layer, and is interacting with its client only by passing simple structures and entities. the datalayer is completely hidden.
So my usual structure looks like:
Solution
Business.Contracts (interfaces for bll layer in here)
Business.Logic (concrete implementations of contracts in here)
Business.Entities (Pocos that bll uses)
Data.Contracts (interfaces for dal)
Data.Sql (Concrete Sql implementation of contracts)
Common.Enums (Enums needed by all projects)
FrontEnd (Main mvc app)
So in this structure, my mvc project only ever deals with the business namespace and the common namespace.
When interacting with the entities however, I tend to use my own models in the mvc project to allow me to add annotations and front end specific functionality, then i provide implicit conversions for these models to be able to be used interchangeably with the business entities.
HTH