Как мне отображать все ингредиенты из рецепта, когда я использую отношение «многие ко многим» в EF? - PullRequest
1 голос
/ 03 июня 2019

Итак, я хочу отобразить в представлении все ингредиенты, которые есть в рецепте.Я создал с помощью EF таблицу ингредиентов и таблицу рецептов.Отношения многие ко многим.Я не могу понять, как показать в одном виде ингредиенты рецепта.

Я пытался изменить модели так, чтобы я мог показать ингредиенты, но я смог увидеть только один ингредиент.

Это мой класс Ингредиентов:

namespace Licenta.Models
{
    public class Ingredient
    {
        [Key]
        public int IDIngredient { get; set; }
        public string Nume { get; set; }
        public int Kcal { get; set; }
        public int Pro { get; set; }
        public int Carbo { get; set; }
        public int Fat { get; set; }
        public IList<Recipe> Recipes { get; set; }
    }
}

Это мой класс Рецептов:

namespace Licenta.Models
{
    public class Recipe
    {
        [Key]
        public int IDRecipe { get; set; }
        public string Name { get; set; }
        public string Desc { get; set; }
        public string Steps { get; set; }
        public int Kcal { get; set; }
        public int Pro { get; set; }
        public int Carbo { get; set; }
        public int Fat { get; set; }
        public IList<Ingredient> Ingredients { get; set; }

    }
}

А это мой Вид:

@model Licenta.Models.Recipe

@{
    ViewBag.Title = "Details";
}

<h2>Recipe Details</h2>

<div>
    <h4>Recipe</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            Name:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Name)
        </dd>
        <dt>
            Calories:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Kcal) calorii
        </dd>
        <dt>
            Proteins:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Pro) grame
        </dd>
        <dt>
            Carbs:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Carbo) grame
        </dd>
        <dt>
            Fat:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Fat) grame
        </dd>
        <dt>
            Description:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Desc)
        </dd>
        <dt>
            Steps:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Steps)
        </dd>
        <dt>
            Ingredients:
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Ingredients)
        </dd>
    </dl>
</div>

Контроллервот что я использую:

namespace Licenta.Controllers
{
    public class HomeController : Controller
    {

        private DataContext db = new DataContext();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Recipes()
        {
            return View(db.Recipes.ToList());
        }

        public ActionResult Details(int? id)
        {
            if(id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Recipe recipe = db.Recipes.Find(id);

            if(recipe == null)
            {
                return HttpNotFound();
            }

            return View(recipe);
        }

    }
}

Я также видел, что EF создал таблицу RecipesIngredients в моей базе данных.Как мне использовать эту таблицу для составления списка ингредиентов моего рецепта?

1 Ответ

1 голос
/ 03 июня 2019

Вы должны включить ингредиенты рецепта при запросе их из БД.

т.е.: заменить

db.Recipes.Find(id);

на

db.Recipes.Include(x => x.Ingredients).Single(y => y.Id == id);

Чтобы отобразить информацию об ингредиентах, вам нужно пройтись по ингредиентам и показать любые данные по каждому ингредиенту, которые вы хотите.

т.е.: заменить

 <dd>
     @Html.DisplayFor(model => model.Ingredients)
 </dd>

на

@foreach(var ingredient in Model.Ingredients)
{
     /*feel free to format/display this however you want.
       this is only intended to show you how to accomplish
       what you're asking*/

     Nume: @ingredient.Nume
     Carbo: @ingredient.Carbo
     Pro: @ingredient.Pro
}

Вы также можете создать шаблон отображения, который принимает IList<Ingredient> в качестве модели.Если вы это сделаете, вам вообще не нужно будет менять текущую модель, поскольку DisplayFor автоматически будет искать используемый шаблон дисплея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...