Как отображать данные из двух отдельных таблиц в MVC?

Итак, я новичок в программировании, и я пытаюсь сделать свой первый проект .net, и я застрял.

У меня есть база данных, содержащая таблицу Product, она выглядит так:

    [Key]
    public int ProductId { get; set; }

    public string ProductName { get; set; }

    [Range(1, int.MaxValue)]
    public double ProductPrice { get; set; }

    public string ProductDescription { get; set; }

    public string ProductImagePath { get; set; }
   
    public int ProductColorId { get; set; }
    [ForeignKey("ProductColorId")]
    public virtual ProductColor ProductColor { get; set; }

   
    public int ProductShippingOptionId { get; set; }
    [ForeignKey("ProductShippingOptionId")]
    public virtual ProductShippingOption ProductShippingOption { get; set; }

    
    
    public int ProductConditionId { get; set; }
    [ForeignKey("ProductConditionId")]
    public virtual ProductCondition ProductCondition { get; set; }

Столбцы ProductShippingOption, ProductColor и ProductCondition — это отдельные таблицы, каждая из которых содержит столбцы для идентификатора и имени.

Когда я добавляю продукт в базу данных, я хочу показать сведения только об одном продукте в представлении, но мне нужно отобразить ProductConditionName вместо ProductConditionId (например).

Что я должен включить в свою ViewModel и свой контроллер, чтобы я мог использовать его в своем представлении?

Мое действие в ProductController выглядит так

public IActionResult ProductTemplate(int? id)
    {
        ProductVM productVM = new ProductVM()
        {
            Product = _db.Product.Find(id),
            
        };

        if (id == 0)
        {
            return NotFound();
        }

        if (id == 0)
        {
            return NotFound();
        }

       

        if (productVM==null)
        {
            return NotFound();
        }

        return View(productVM);

    }

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучший и самый простой способ сделать это — включить классы в Product:

Для вашего действия ProductTemplate:

ProductVM productVM = new ProductVM()
{


    Product = _db.Product.Where(s=>s.Id == id)
                         .Include(s=>s.ProductColor)
                         .Include(s=>s.ProductShippingOption)
                         .Include(s=>s.ProductCondition)
                         .FirstOrDefault();
};

И вы можете вызвать их в своем .cshtml с помощью (допустим, вы хотите имя ProductColor):

@Model.Product.ProductColor.Name

В качестве альтернативы вы можете добавить Include() к своему контексту, чтобы включить все по умолчанию.

Почти уверен, что Include должен идти перед Find, так как Find запускает перечисление в вашем запросе. Вы можете избежать добавления включений позже в тех случаях, когда перечисление еще не запущено (например, после Where), но не после того, как перечисление уже произошло (Find, Single, First, ...)

Flater 21.03.2022 11:19

Спасибо, я обычно использую «Где», поэтому не знал, что мы не можем включить после находки. Отредактировано соответственно

AsIndeed 21.03.2022 11:22

Нет проблем, это просто замазать. Это несколько отменяет совет в вашем последнем абзаце. Независимо от того, где вы поместите Include (если он стоит перед перечислением), он работает точно так же. На самом деле нет способа «добавить его в ваш контекст», изменив порядок связанного метода (опять же, я игнорирую пост-перечисление, поскольку это просто не работает).

Flater 21.03.2022 11:25

Другие вопросы по теме