У меня есть шаблон упражнения с названием, описанием и количеством подходов. Я хочу создать несколько объектов упражнения * из количества наборов. Например, у меня есть шаблон [{ "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();
Я добавил код не в виде изображения, а дополнительных пояснений.