Entity Framework Core - невозможно удалить глубоко вложенные объекты до / после вызова .Update для родительского - PullRequest
0 голосов
/ 02 июня 2019

Я использую .Net Core версии 2.1.200.

У меня есть следующая структура классов (упрощенная версия)

public class Workout
{
    public int WorkoutID { get; set; }
    public int UserID { get; set; }
    public DateTime Date { get; set; }
    public string Notes { get; set; }
    public List<WorkoutExercise> Exercises { get; set; }
}

public class WorkoutExercise
{
    public int WorkoutExerciseID { get; set; }
    public int ExerciseID { get; set; }
    public int ExerciseNo { get; set; }
    public Workout Workout { get; set; }
    public List<WorkoutExerciseSet> Sets { get; set; }
}

public class WorkoutExerciseSet
{
    public int WorkoutExerciseSetID { get; set; }
    public int Reps { get; set; }
    public decimal Weight { get; set; }
    public WorkoutExercise WorkoutExercise { get; set; }
}

Итак, у тренировки есть список упражнений, иу каждого упражнения есть список наборов.

Теперь, когда я хочу обновить тренировку, я хочу иметь возможность добавлять / удалять / обновлять любые упражнения WorkoutExercise или WorkoutExerciseSet.

У меня есть следующееКонечная точка API:

public IActionResult UpdateWorkout([FromBody] Workout workout)
{
    Workout originalWorkout = _context.Workouts.Include(x => x.Exercises)
                                               .ThenInclude(set => set.Sets)
                                               .Where(x => x.WorkoutID == workout.WorkoutID)
                                               .AsNoTracking()
                                               .FirstOrDefault();

    _context.Update(workout);
    _context.SaveChanges();

    //If there are no exercises in the parameter object and there were exercises saved previously
    //We want to remove all saved exercises and corresponding sets
    if(workout.Exercises.Count == 0 && originalWorkout.Exercises.Count > 0)
    {
        List<WorkoutExercise> removedExercises = originalWorkout.Exercises.ToList();
        foreach (WorkoutExercise exercise in removedExercises)
        {
            List<WorkoutExerciseSet> removedSets = exercise.Sets.ToList();
            _context.WorkoutExerciseSets.RemoveRange(removedSets);
        }
        _context.WorkoutExercises.RemoveRange(removedExercises);
    }

    _context.SaveChanges();
}

Он просто получает сохраненную версию той же тренировки из БД, а затем проверяет, были ли удалены какие-либо упражнения.Если да, то я хочу удалить эти упражнения.

Теперь, когда я запускаю это, я получаю следующее сообщение об ошибке

The instance of entity type 'Workout' cannot be tracked because another instance with the key value 'WorkoutID' is already being tracked.
When attaching existing entities, ensure that only one entity instance with a given key value is attached.

Вышеупомянутый код разрывается на строку

_context.WorkoutExerciseSets.RemoveRange(removedSets);

Если переместить строку «_context.Update (workout)» НИЖЕ второй «_context.SaveChanges ()», то же сообщение об ошибке выдается на

_context.Update(workout);

Есть ли у кого-нибудь какие-либо рекомендации дляшаги, которые я должен предпринять, чтобы решить эту проблему?

Спасибо

...