使用LINQ to SQL在ASP.NET MVC中建模多对多关系

Joe*_*ips 5 asp.net-mvc data-modeling

我一直在阅读和观看有关MVC的视频,我开始有点困惑.简单的教程太简单了,它们似乎只涉及一个数据库表.哎呀!

高级教程假设存在大量知识,我无法遵循这些知识.更不用说,有15种方法可以模拟您的数据库,没有人想解释为什么他们这样或那样做.

所以,我正在寻找一个简单的教程或解释你将要设计一个涉及多对多关系的简单CRUD应用程序的过程,如下所述.我可能没有提供足够的信息,因此请随时请求更新.

更新: 我有兴趣看到Linq To Sql解决方案.

我查看了nerddinner PDF,我的模型与他的模型有点不同.我希望与我的膳食和我的成分有多对多的关系.他只使用1对多的晚餐和RSVP.此外,他从未展示过如何将RSVP附加到他的晚餐模型中.这基本上是我遇到的问题.为什么我的膳食模型不包含成分列表?我有适当的外键.我不知道我在哪里或如何设置它以便我可以通过Meal模型访问成分,如果我想在细节视图或其他东西上打印它们.

膳食

  • ID
  • 标题
  • 描述

配料

  • ID
  • 名称

膳食配料

  • Id_Meal
  • Id_Ingredient

Nei*_* T. 7

我在当前的项目中有很多这种关系的例子.我正在使用MVC 1和LINQ-to-SQL.我遇到了与你现在遇到的完全相同的挫败感.最大的障碍是接受LINQ-to-SQL不直接管理多对多关系这一事实,但理解它不需要为了获得您需要的信息.

让我们从CRUD中的R开始,因为它是演示需要完成的最简单的方法.现在,在这一点上,我建议创建一个强类型视图模型,只是为了简化聚合视图数据的任务,并简化将膳食数据分配到详细信息视图:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

要检索膳食及其成分列表,这是控制器方法:

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

    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)
            .ToList()
    };

    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

如前所述,LINQ-to-SQL不直接支持多对多关系,这就是为什么你不能直接从Meal中看到Ingredients实体的原因.但是,如控制器操作方法中所示,您可以从Meal实体访问关联实体(Meals-Ingredients).从关联实体,您可以访问Ingredients实体以获取成分列表.视图看起来像这样:

<%@ 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 />
    <p>Ingredients:</p>
    <ul>
        <% foreach(Ingredient item in Model.Ingredients) 
           { %>
            <li><%= item.Name %></li>
        <% } %>
    </ul>
    <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") %>
</asp.Content>
Run Code Online (Sandbox Code Playgroud)

如果使用所需的外键关系正确设置了数据库模式,则此方法应该为您提供所需的结果.


小智 2

我找到的唯一解决方案是使用 PLINQ。据我所知,它并不完美。

我手动使用“PLINQ方法”:http://www.codeproject.com/KB/linq/linq-to-sql-many-to-many.aspx

不过我同意,我讨厌一遍又一遍地编写所有代码。这不是一个“干净”的解决方案。