У меня есть шаблон упражнения с названием, описанием и количеством подходов. Я хочу создать несколько объектов упражнения * из количества наборов. Например, у меня есть шаблон [{ "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; }
}
При работе с базой данных ОБЯЗАТЕЛЬНО иметь a unique key column. Тогда вы можете иметь несколько строк, каждая со своим ключом.
Таблица упражнений имеет идентификатор PrimaryKey.
Вы не устанавливаете этот ключ, он автоматически увеличивается?
Только что проверил ваш скриншот, у них ОДИН и тот же идентификатор, поэтому не получается.
Да, но идентификатор ss устанавливается автоматически с помощью сущности framework, и если я попытаюсь добавить его сам, это вызовет ошибку.
Покажите код FitnessPlan.
Я добавил код. Вот также github со всем решением: github.com/NotZetka/Fitness/blob/main/API/Handlers/Plans/…
«Если я попытаюсь добавить его сам, это вызовет ошибку». Какое исключение? и на какой линии?
Экземпляр типа сущности "Упражнение" невозможно отследить, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей. В строке 57: дождитесь _context.SaveChangesAsync();





Проблема в том, что 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();
Я добавил код не в виде изображения, а дополнительных пояснений.