Моделирование отношения «многие ко многим» в ASP.NET MVC с использованием LINQ to SQL - PullRequest
5 голосов
/ 27 января 2010

Я читаю и смотрю видео о MVC, и я начинаю немного запутываться. Простые учебные пособия слишком просты и, кажется, включают только одну таблицу базы данных. Whoopty ду!

Продвинутые учебники предполагают наличие большого количества знаний, и у меня возникают проблемы с их выполнением. Не говоря уже о том, что существует 15 способов моделирования вашей базы данных, и никто не хочет объяснять, почему они делают это так или иначе.

Итак, я ищу простое учебное пособие или объяснение того, через какой процесс вы будете разрабатывать простое приложение CRUD, которое подразумевает взаимосвязь «многие ко многим», как описано ниже. Возможно, я не предоставил достаточно информации, поэтому не стесняйтесь запрашивать обновления.

Обновление: Мне было бы интересно увидеть решение Linq To Sql.

Я просмотрел PDF-файл, и моя модель должна немного отличаться от его. Я хочу много-много отношений с моей едой и моими ингредиентами. Он просто использует 1-ко-многим со своим Ужином и RSVP. Кроме того, он никогда не показывает, как он прикрепил RSVP к своей модели Dinner. По сути, это проблема, с которой я столкнулся. Почему моя модель Meal не содержит списка ингредиентов? У меня есть соответствующие внешние ключи на месте. Я не уверен, где и как я настроил бы его так, чтобы я мог получить доступ к ингредиентам через модель «Питание», если бы я хотел напечатать их в окне подробностей или что-то в этом роде.

Питание

  • Id
  • Название
  • Описание

Ингредиенты

  • Id
  • Имя

Питание-Ingredients

  • Id_Meal
  • Id_Ingredient

Ответы [ 6 ]

7 голосов
/ 31 января 2010

У меня есть много примеров такого рода отношений в моем текущем проекте. Я использую 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>

Если ваша схема базы данных правильно настроена с нужными вам отношениями внешнего ключа, этот подход должен дать вам желаемый результат.

4 голосов
/ 27 января 2010

Я настоятельно рекомендую «Pro ASP.NET MVC Framework» Стива Сандерсона. На данный момент это лучшее руководство по ASP.NET MVC, которое я видел, и, на мой взгляд, намного лучше, чем книга Wrox от команды MSoft. Хорошо стоит денег, если вы хотите попасть в него.

Amazon Link

2 голосов
/ 04 июня 2010

Единственное решение, которое я нашел, было использование PLINQ. Насколько я знаю, он не идеален.

Я использую «метод PLINQ» вручную: http://www.codeproject.com/KB/linq/linq-to-sql-many-to-many.aspx

Я согласен, хотя, я ненавижу писать весь этот код снова и снова. Это не «чистое» решение.

2 голосов
/ 27 января 2010

Ты не получишь все на серебряной тарелке. Вам придется пройти через hell of wtf самостоятельно.

Это как со мной и Ruby on Rails - каждый раз, когда я вижу образец фрагмента или пример приложения - это кажется супер просто и аккуратно. Но - поскольку я сам никогда ничего не создавал, у меня нет идей, с чего начать.

Итак - просто пройдите некоторые книги и примеры приложений . Тогда - создай что-нибудь. Это чувство (с чего начать, как структурировать и т. Д.) Совсем скоро исчезнет.

Позже - не забывайте о второй крайности - чувстве, что вы знаете все, что должны знать. :)


И да - вы не предоставили достаточно информации. Есть различные пути, чтобы пройти. Я верю - вам не захочется слышать о продвинутых подходах к проектированию на основе предметной области. Также вы не хотите видеть Sql рядом с HTML-разметкой. Только вы знаете контекст и можете решать, что нужно, хорошо, а что нет.

1 голос
/ 27 января 2010

Предлагаю вам проверить Профессиональный ASP.NET MVC 1.0 . Существует целая бесплатная глава, в которой рассматриваются некоторые настройки реального приложения.

И взгляните на http://www.nerddinner.com/, чтобы увидеть готовый продукт.

Это очень простое приложение MVC, и если вы получите книгу, вы можете следовать ей от концепции до готового продукта.

0 голосов
/ 27 января 2010

Я считаю, что у Стивена Уолтера есть отличные учебные пособия для asp.net MVC версии 1, при условии, что вы работаете с первой версией, поскольку версия 2 еще не выпущена (в настоящее время RC). Первый рабочий урок начинается здесь , и вы сможете найти остальное оттуда. У него также есть много хороших советов, если вы будете искать в его блоге на этом сайте.

Кроме того, большинство этих руководств охватывает VB и C #, если это важно для вас.

...