I think that most of the quotes around MVC are generally ok but I'll assume you are talking about...lets be specific and actually call it...Microsoft View Controller. As they tend to always add their own little bit (and while many disagree, in my opinion, I think for the most part their intentions are well formed but this is a debate for another topic).
I just wanted to emphasise that Microsoft-View-Controller is actually a different variant on the Model-View-Controller theme.
The way I use it is as follows:
I generally separate my concerns using various patterns because well lets be blunt...one of the slowest parts of any system is data access, followed closely by bandwidth. So I feel strongly that it is wrong to do as many suggest by putting business logic in the model for 2 reasons:
- MVC (whatever variant) is a methodology to development that is designed to be extensible and maintainable.
- There is no way in Microsoft-VC to connect a view to multiple models (unless you use ViewModels). This practice is encouraged and security concerns relating to connecting directly with the back end models abound. So needed or not, its generally considered bad practice to connect views directly to models and instead you should connect them with ViewModels.
MVC is a layered architecture. So layer it. By this I mean let EF do its job of mapping your tables to classes and leave it alone. Microsoft-VC forces people to apply a design pattern (Open/Close principle) to the model by auto-generating code using "Partial" classes. So you create your own empty partial class and then add your metadata to this. Its not a good idea to add code here as it becomes tightly coupled with the model. Instead...
Add a repository layer using the repository pattern. This uses all your model classes to do basic (very basic) CRUD. Then...
Add a domain (business) layer, and make it call the repo layer to get the data it needs to do the business rules...Then...
Connect your controllers to your business layers only and use a tool like automapper to map the data returned from the domain layer on to view models for your views.
As you grow in experience with this, you can later add interfaces between the layers as needed and its easy to apply the well known IOC pattern with some form of DI.
Hope this helps...But in general, the fact that MVC is a layered architecture means that adding layers is what it is designed to do so don't restrict yourself to only working with one way. Also remember, if you hear people saying that N-Tier multi layered architectures are for big systems only this is nonsense...every system is a big system. No business invests potentially at least 100's of thousands to develop a small system and leaves it at that (I know I get paid a lot of money to develop such systems, based on my salary alone and the taxes the employer has to pay above and beyond my salary, I can say with confidence that any company that employs more than 2 developers is already well past the 100K per year cost of developing so called "small" systems). All systems are designed to grow and the earlier you adopt this approach the easier your system will be to maintain and expand.