Take the 2-minute tour ×

I've been reading and watching videos about MVC and I'm starting to get a little confused. The simple tutorials are far too simple and they seem to only involve a single database table. Whoopty doo!

The advanced tutorials assume a lot of knowledge is present and I have trouble following those. Not to mention, there are 15 ways to model your database and nobody wants to explain why they do it this way or that way.

So, I'm looking for a simple tutorial or explanation of what process you would go through to design a simple CRUD application that involves a many-to-many relationship, explained below. I may not have provided enough information so feel free to request updates.

Updates: I would be interested in seeing a Linq To Sql solution.

I went through the nerddinner PDF and my model has to be a little different than his. I want a many-to-many relationship with my Meal and my Ingredients. He just uses a 1-to-many with his Dinner and RSVPs. Also, he never shows how he attached the RSVPs to his Dinner model. This is essentially the problem I'm having. Why is it that my Meal model does not contain a list of Ingredients? I have the proper foreign keys in place. I'm not sure where or how I would set it up so that I can access the ingredients through the Meal model if I wanted to print them on the details view or something.


  • Id
  • Title
  • Description


  • Id
  • Name


  • Id_Meal
  • Id_Ingredient
share|improve this question
I take it you've already looked at the Nerd Dinner tutorial series? nerddinner.codeplex.com –  Kane Jan 27 '10 at 6:46
Yes, I've looked at most of them on asp.net/mvc –  Joe Philllips Jan 27 '10 at 6:55
Also check out scott gu's blog. –  Jay Zeng Jan 27 '10 at 6:57
Note that the MVC as a framework does not care what business logic and data layers you use. If you are interested in BL and DB layers, you should look into LINQ for bridging your models and the BL, and Entity Framework (if you are interested in an MSFT only solution) or NHibernate (if you are interested in alternative open source solutions) for the ORM mapping between BL and DB. –  Franci Penov Jan 27 '10 at 7:07
I did eventually switch to NHibernate and I'm much happier with it than with Linq to Sql –  Joe Philllips Sep 26 '10 at 17:36
add comment

6 Answers

up vote 2 down vote accepted

The only solution I found was using PLINQ. It isn't perfect as far as I know though.

I use the "PLINQ method" manually: http://www.codeproject.com/KB/linq/linq-to-sql-many-to-many.aspx

I agree though, I hate writing all that code over and over again. It isn't a "clean" solution.

share|improve this answer
Thanks. I did come back to this question and re-read through the answers. I'm working on trying out this method and it seems promising. More of what I was looking for. –  Joe Philllips Jun 24 '10 at 5:33
I have changed my answer because I truly think this is the right way to go (plinq manually). It seems to be how many-to-many relationships really should behave. –  Joe Philllips Jun 27 '10 at 7:01
add comment

I have many examples of this type of relationship in my current project. I'm using MVC 1 and LINQ-to-SQL. I went through exactly the same frustration then as you are experiencing now. The biggest hurdle is accepting the fact that LINQ-to-SQL doesn't directly manage many-to-many relationships, but understanding that it doesn't need to in order to get the information you require.

Let's start with the R in CRUD, since it's the easiest way to demonstrate what needs to be done. Now, at this point I would recommend creating a strongly-typed view model, just to ease the task of aggregating your view data and to simplify the assignment of the meal data to the Details view:

public class MealDetailsViewModel
    public int Id_Meal { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }

    private List<Ingredient> _Ingredients = new List<Ingredient>();
    public List<Ingredient> Ingredients
       get { return _Ingredients; }
       set { _Ingredients = value; }

To retrieve a meal and its list of ingredients, here's the controller method:

public ActionResult Details (int mealID)
    Meal result = DataContext.Meals
        .Where(a => a.Id_Meal == mealID)

    MealDetailsViewModel viewModel = new MealDetailsViewModel
        Id_Meal = result.Id,
        Title = result.Title,
        Description = result.Description,
        Ingredients = result.Meals-Ingredients
            .Where(a => a.Id_Meal == mealID)
            .Select(a => a.Ingredient)

    return View(viewModel);

As previously stated, LINQ-to-SQL doesn't directly support many-to-many relationships, which is why you cannot see the Ingredients entity directly from Meal. However, as illustrated in the controller action method, you can access the association entity (Meals-Ingredients) from the Meal entity. From the association entity, you can access the Ingredients entity to get the list of ingredients. The view would look something like this:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="ViewPage<MealDetailsViewModel>" %>

<asp:Content ID="mainMealDetails" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%= Model.Title %></h2>
    <h3><%= Model.Description %></h3>
    <br />
        <% foreach(Ingredient item in Model.Ingredients) 
           { %>
            <li><%= item.Name %></li>
        <% } %>
    <br />
    <%= Html.ActionLink("Update", "Edit", new { id = Model.Meal_ID }) %> |
    <%= Html.ActionLink("Add Ingredient", "IngredientCreate", new{ id = Model.Meal_ID }) %> |
    <%= Html.ActionLink("Delete", "Delete", new { id = Model.Meal_ID }) %> |
    <%= Html.ActionLink("Back to Menu List", "Index") %>

If your database schema is correctly set up with the foreign key relationships you require, this approach should give you the outcome you're looking for.

share|improve this answer
Thank you very much for taking the time to explain this! I will look at it in more detail later and try to implement it based on your suggestions. –  Joe Philllips Jan 31 '10 at 21:12
I have made a few changes to your code to fix a few problems. Still working on getting it totally implemented. –  Joe Philllips Feb 1 '10 at 6:30
With a few minor adjustments, this did the trick –  Joe Philllips Feb 2 '10 at 5:04
Glad to help...good luck moving forward. –  Neil T. Feb 2 '10 at 5:12
add comment

I highly recommend Steve Sanderson's 'Pro ASP.NET MVC Framework'. It's by far the best ASP.NET MVC guide I've seen, and in my opinion much better than the Wrox book by the MSoft team. Well worth the money if you want to get into it.

Amazon Link

share|improve this answer
+1 for the book. It is the best one I have read on MVC as well. –  Matt Spradley Jan 27 '10 at 7:16
I'm still trying to decide if I want to go as far as learn the innards of MVC. Not ready to invest in a book quite yet –  Joe Philllips Jan 27 '10 at 16:05
The book doesn't really explore 'the innards' just how to use it effectively. –  UpTheCreek Jan 28 '10 at 6:41
If it's this complicated to do a basic many to many relationship, I'm not sure if I like mvc enough to use it effectively =P -- we'll see –  Joe Philllips Jan 29 '10 at 3:53
Like most of you, I spent weeks trying to solve and resolve this exact issue and attributed my inability to solve the problem with a problem with MVC. The problem is not with MVC...finding the solution to this problem requires a better understanding of how LINQ-to-SQL does what it does. Once you figure that out, implementing an MVC solution to handle the problem is pretty straightforward. –  Neil T. Jan 31 '10 at 20:23
show 2 more comments

You won't get everything on silver plate. You will have to go through hell of wtf yourself.

It's like with me and Ruby on Rails - every time i see sample snippet or sample application - it seems super duper simple and neat. But - because I've never actually created anything myself, i got no ideas with what even to start.

So - just go through some books and sample applications. Then - create something. This feeling (with what to start, how to structure etc.) will disappear quite soon.

Later on - don't forget about second extreme - feeling that you know everything you have to know. :)

And yeah - you did not provide enough information. There's various paths to go by. I believe - you won't want to hear advanced domain driven design approaches. Neither you want to see Sql right next to html markup. Only you know 'the context' and can decide what's necessary, good and what's not.

share|improve this answer
This is how I feel. I'm trying to get through the "hell of wtf" part :) –  Joe Philllips Jan 27 '10 at 14:41
Good answer. This is what worked for me too. –  cottsak Jan 30 '10 at 18:14
@cottsak thanks... –  Arnis L. Jan 30 '10 at 18:38
This is good feedback, but it seems more appropriate as a comment, rather than an actual answer...for me at least. Others might disagree. –  pqsk Dec 5 '13 at 18:52
add comment

I suggest you check out Professional ASP.NET MVC 1.0. There is an entire free chapter available that walks through some of the setup for a real application.

And take a look at http://www.nerddinner.com/ to see the finished product.

This is a very simple MVC application and if you get the book you can follow it from concept to finished product.

share|improve this answer
I did watch the creation of nerddinner –  Joe Philllips Jan 27 '10 at 6:51
Alright, apparently the video is different than the PDF! The PDF is waaay more helpful. –  Joe Philllips Jan 27 '10 at 17:28
I'm very confused. The asker marks my answer up, and then marks it as the answer and now I'm marked down twice by other users... nice. It would be nice to know why. –  Jeremy Seekamp Jan 28 '10 at 22:48
I read through nerddinner and it didn't explain how the RSVPs became a part of a Dinner. I can't mark you up unless you edit your answer –  Joe Philllips Jan 29 '10 at 0:42
add comment

I find Steven Walther has some great tutorials for asp.net MVC version 1, assuming you're working with the first version as version 2 is not released yet (RC currently). The first working tutorial starts here and you should be able to find the rest from there. He also has lots of good tips if you search through his blog on that site.

Also most of this tutorials cover VB and C#, if that's important to you.

share|improve this answer
C# is preferred but I am familiar with both –  Joe Philllips Jan 27 '10 at 14:42
add comment

Your Answer


