Невозможно добавить в БД несколько одинаковых объектов, сохраняются только разные. .NET EntityFramework

У меня есть шаблон упражнения с названием, описанием и количеством подходов. Я хочу создать несколько объектов упражнения * из количества наборов. Например, у меня есть шаблон [{ "name": "Legs", "sets": 3 }, { "name" : "Arms", "sets" : 2 } в БД, я хочу сохранить [ {legs}, { ноги}, {ноги}, {руки}, {руки}], но сохраняются только [{ноги}, {руки}].

Фрагмент кода

            var exercises = planTemplate.Exercises
                .SelectMany(x => Enumerable.Repeat(new Exercise
                {
                    Name = x.Name,
                    Description = x.Description
                }, x.Sets))
                .ToList() ?? new List<Exercise>();

            var plan = new FitnessPlan
            {
                TemplateId = planTemplate.Id,
                Archived = false,
                User = user,
                Name = planTemplate.Name,
                Exercises = exercises,
            };

            await _context.FitnessPlans.AddAsync(plan);
            await _context.SaveChangesAsync();

На прикрепленном экране все они сохранены с идентификатором упражнения 1024 или 1025, а не уникальны в диапазоне 1024–1028. В упражнениях по свойствам у меня есть 5 объектов без идентификаторов, но объектная структура после сохранения изменений дает им одинаковые идентификаторы для объектов с одинаковой структурой, хотя это разные объекты.

Класс Фитнесплана

    public class FitnessPlan
    {
        public int Id { get; set; }

        public int TemplateId { get; set; }
        public bool Archived { get; set; }
        public int UserId { get; set; }
        public AppUser User { get; set; }
        public string Name { get; set; }
        public IEnumerable<Exercise> Exercises { get; set; }
    }

Я добавил код не в виде изображения, а дополнительных пояснений.

Zetka 08.07.2024 14:24

При работе с базой данных ОБЯЗАТЕЛЬНО иметь a unique key column. Тогда вы можете иметь несколько строк, каждая со своим ключом.

Poul Bak 08.07.2024 14:46

Таблица упражнений имеет идентификатор PrimaryKey.

Zetka 08.07.2024 15:07

Вы не устанавливаете этот ключ, он автоматически увеличивается?

Poul Bak 08.07.2024 15:14

Только что проверил ваш скриншот, у них ОДИН и тот же идентификатор, поэтому не получается.

Poul Bak 08.07.2024 15:16

Да, но идентификатор ss устанавливается автоматически с помощью сущности framework, и если я попытаюсь добавить его сам, это вызовет ошибку.

Zetka 08.07.2024 15:20

Покажите код FitnessPlan.

Poul Bak 08.07.2024 15:23

Я добавил код. Вот также github со всем решением: github.com/NotZetka/Fitness/blob/main/API/Handlers/Plans/…

Zetka 08.07.2024 15:30

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

Poul Bak 08.07.2024 15:46

Экземпляр типа сущности "Упражнение" невозможно отследить, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей. В строке 57: дождитесь _context.SaveChangesAsync();

Zetka 08.07.2024 23:03
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема в том, что Enumerable.Repeat возвращает один и тот же экземпляр объекта для каждого набора, и ваша коллекция exercises заполняется одним объектом. Вам следует изменить его на Enumerable.Range

var exercises = planTemplate.Exercises
    .SelectMany(x => Enumerable.Range(1, x.Sets)
        .Select(_ => new Exercise
        {
            Name = x.Name,
            Description = x.Description
        })
    ).ToList();

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