Непонимание отношений между ядром EF

#c# #entity-framework-core

#c# #сущность-фреймворк-ядро

Вопрос:

Я довольно новичок в Entity Framework, и я довольно сильно запутался в том, как сначала определить вещи в коде.

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

 public class Meal
{
    public int MealId { get; set; }
    public DayOfWeek DayOfWeek { get; set; }
    public Recipe Recipe { get; set; }
    public int RecipeId { get; set; }
    public WeeklySchedule WeeklySchedule { get; set; }
}
  

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

Рецепт класса:

 public class Recipe
{
    public int RecipeId { get; set; }
    public string Name { get; set; }
    public ICollection<RecipeItem> RecipeItems { get; set; }
}
  

И еженедельный график:

 public class WeeklySchedule
{
    public int WeeklyScheduleId { get; set; }
    public int WeekNumber { get; set; }
    public List<Meal> Meals { get; set; }

    public WeeklySchedule() { }

    public WeeklySchedule(int weeknumber)
    {
        WeekNumber = weeknumber;
        Meals = new List<Meal>();
    }
}
  

Когда я создаю модель, я определяю:

 modelBuilder.Entity<Recipe>().HasMany(c => c.RecipeItems).WithOne(c => c.Recipe).OnDelete(DeleteBehavior.Cascade); 
modelBuilder.Entity<RecipeItem>().HasMany(c => c.RecipeItemComponents).WithOne(c => c.RecipeItem).OnDelete(DeleteBehavior.Cascade); 
modelBuilder.Entity<WeeklySchedule>().HasMany(c => c.Meals).WithOne(c => c.WeeklySchedule).OnDelete(DeleteBehavior.Cascade); 
modelBuilder.Entity<Meal>().HasOne(c => c.Recipe); 
  

Я использую этот код для его хранения:

 _context.WeeklySchedules.Add(weeklySchedule);
 await _context.SaveChangesAsync();
  

Моя проблема в том, что когда я пытаюсь сохранить новое блюдо, я получаю сообщение об ошибке:

Исключение SQLException: не удается вставить явное значение для столбца identity в таблице ‘Recipes’, когда для IDENTITY_INSERT установлено значение OFF.

Хотя в моем случае я не хочу создавать рецепт, но я создаю просто блюдо, указывающее на существующий рецепт.

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

Не могли бы вы помочь мне понять, что к чему?

Комментарии:

1. Не используйте свойства shadow, они только сбивают с толку. Добавить public int RecipeId { get; set; } к объекту Meal

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

3. Можете ли вы поделиться кодом? Это происходит, если вы пытаетесь использовать несвязанный объект

4. @CamiloTerevinto уверен. Какая часть кода здесь важна?

5. Столько кода, сколько вы считаете уместным для добавления нового блюда, особенно из того источника, откуда берется объект Recipe. (Примечание: самый быстрый ответ: использовать Meal.RecipeId вместо Meal.Recipe )