У меня есть много примеров такого рода отношений в моем текущем проекте. Я использую MVC 1 и LINQ-to-SQL. Тогда я пережил точно такое же разочарование, как и вы сейчас. Самым большим препятствием является тот факт, что LINQ-to-SQL напрямую не управляет отношениями «многие ко многим», но понимает, что это не нужно для получения необходимой информации.
Давайте начнем с R в CRUD, поскольку это самый простой способ продемонстрировать, что нужно сделать. Теперь, на этом этапе, я бы порекомендовал создать строго типизированную модель представления, просто чтобы упростить задачу агрегирования данных вашего представления и упростить назначение данных о еде представлению Details:
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; }
}
}
Чтобы получить блюдо и список его ингредиентов, используйте метод контроллера:
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);
}
Как уже говорилось, LINQ-to-SQL напрямую не поддерживает отношения «многие ко многим», поэтому вы не можете видеть сущность Ingredients непосредственно из Meal. Однако, как показано в методе действия контроллера, вы можете получить доступ к объекту ассоциации (Meals-Ingredients) из объекта Meal. Из объекта ассоциации вы можете получить доступ к объекту 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>
Если ваша схема базы данных правильно настроена с нужными вам отношениями внешнего ключа, этот подход должен дать вам желаемый результат.