1

У меня есть 2 модели, рецепт и ингредиенты. Рецепт может содержать много ингредиентов, а также ингредиент может принадлежать многим рецептам. Проблема, с которой я сталкиваюсь, - это когда я пытаюсь добавить, скажем, 3 (количество) яиц, я добавляю одну и ту же сущность 3 раза, но когда я прочитаю модель, она просто указана один раз. Я предполагаю, что на самом деле это только спасает, так как это «дубликат». Подробности смотрите ниже.ASP.NET MVC5 Много-ко-многим отношениям с несколькими одинаковыми записями

Модели:

public class Recipe 
{ 
    public int RecipeID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Ingredient> Ingredients { get; set; } 
} 

public class Ingredient 
{ 
    public int IngredientID { get; set; } 
    public string Name{ get; set; } 
    public virtual ICollection<Recipe> Recipes { get; set; } 
} 

Так скажем, у меня есть рецепт (торт), который нуждается в 3 яйца (ингредиенты). В моем коде я бы просто добавил яйцо (Ингредиент) 3 раза, и я ожидал бы, что это сработает. Но когда я читаю рецепт, у него есть только яйцо (Ингредиент). Я предполагаю, что он добавляет RecipeID к Ингредиенту, а затем загружает этот единственный Ингредиент, но как мне пройти мимо этого? Ниже приведен код, который я использую, чтобы добавить ингредиенты в свой рецепт.

[HttpPost] 
public ActionResult Create(Recipe recipe, List<Ingredient> ingredients) 
{ 
    // for example, add ingredient egg 3 times 
    foreach (var item in ingredients) 
    { 
     recipe.Ingredients.Add(item); 
    } 

    db.Recipes.Add(recipe); 
    db.SaveChanges(); 
} 

Надеюсь, у меня не было опечатки в коде, но оно все работает. Он выполняет итерацию через цикл foreach столько раз, сколько это предполагается, и все это хорошо сохраняет. Как я уже говорил ранее, я уверен, что он просто обновляет элемент Ingredient с помощью RecipeID, поэтому на самом деле он связывает только одну копию. Заранее спасибо!

PS: Это мой первый пост, будьте нежны! :) И я искал это широко, прежде чем размещать здесь

Редактировать: Основываясь на комментарии Сатиш Ниссанкала, я просто создал другой класс, который обрабатывает то, что мне нужно.

public class RecipeContents 
{ 
    public int RecipeContentsID { get; set; } 
    public int RecipeID { get; set; } 
    public int Quantity { get; set; } 
    public Ingredient Ingredient { get; set; } 
} 

И затем я добавил это к моему классу Recipe.

public List<RecipeContents> Ingredients { get; set; } 
+0

Лучшее решение, к которому я могу придумать, - это не иметь виртуального ингредиента вообще, он должен иметь открытый список QuantityIngredients {get; задавать; } ', который используется для хранения количества и Ингредиента, а затем просто загружает ингредиенты по мере необходимости. Я считаю, что должен быть более элегантный способ сделать это. Этот способ больше похож на хак. –

ответ

0

Попробуйте добавить количество свойств строки в класс Ингредиент. Все, что вам нужно сделать, это обновить количество до 3 для яиц. Для этого потребуется только обновить свойство, а не добавлять один и тот же ингредиент три раза. Если это какой-либо другой ингредиент, вы можете просто добавить унции или столовую ложку или количество чашек в строку. Тогда получение и показ количества будет достаточным. Дайте мне знать, если это будет полезно?

+0

Я действительно считал, что проблема заключается в том, что ингредиенты могут использоваться для других рецептов. Таким образом, я не могу связать количество строки, которая является частью ингредиента рецепта. Это имеет смысл? Поэтому, в основном, я не хочу, чтобы там были какие-то повторяющиеся ингредиенты, поэтому ингредиент яиц должен использоваться для всех рецептов, требующих яиц. Поэтому я не могу использовать конкретное свойство в ингредиенте для соответствующего рецепта. –

+0

В этом случае добавьте еще один класс, в котором у вас есть RecipeID, IngredientID и Quantity. Вы можете назвать его RecipeDetails. Обновите количество в этой таблице. У вас должно быть место, где вы можете обновить количество. –

+0

Прокомментируйте последнее предложение, и я приму его в качестве ответа. Я написал класс, основанный на том, что вы сказали, и смог заставить его работать правильно! Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^