Я работаю над приложением для отслеживания тренировок, и функциональность, которую я пытаюсь добавить, заключается в том, что пользователь может добавить тренировку с несколькими связанными данными упражнений, где каждая запись имеет связанное с ней упражнение. Каждый из них моделируется отдельный объект, т.е. тренировки, ExerciseRecord и упражнения со следующими соотношениями:Как я могу помешать Entity Framework добавлять повторяющиеся записи?
- тренировки связан со многими ExerciseRecords.
- ExerciseRecord относится к одному Упражнение.
Я также внедрил единицу рабочего класса и хранилища для каждого объекта (хотя я не уверен, что это необходимо - я довольно новичок в ASP.Net MVC!).
Мой код для добавления тренировки выглядит следующим образом:
[HttpPost]
public ActionResult Edit(WorkoutViewModel viewModel)
{
var exerciseRecordList = viewModel.ExerciseRecords;
foreach (ExerciseRecord r in exerciseRecordList)
{
var e = exerciseList.Exercises
.Where(ex => ex.ExerciseId == r.ExerciseId)
.FirstOrDefault();
r.Exercise = e;
if (viewModel.WorkoutId != 0)
{
r.WorkoutId = viewModel.WorkoutId;
}
};
Workout workout;
if (viewModel.WorkoutId == 0)
{
workout = new Workout
{
WorkoutId = viewModel.WorkoutId,
WorkoutDate = viewModel.WorkoutDate,
Duration = viewModel.Duration,
Exercises = exerciseRecordList
};
}
else
{
workout = unitOfWork.WorkoutRepository.GetByID(viewModel.WorkoutId);
workout.WorkoutDate = viewModel.WorkoutDate;
workout.Duration = viewModel.Duration;
workout.Exercises = exerciseRecordList;
}
if (ModelState.IsValid)
{
if (workout.WorkoutId == 0)
{
unitOfWork.WorkoutRepository.Insert(workout);
unitOfWork.Save();
}
else
{
unitOfWork.WorkoutRepository.Update(workout);
unitOfWork.Save();
}
TempData["message"] = "Workout has been saved";
return RedirectToAction("List");
}
else
{
// When there has been a problem with the workout data values
TempData["message"] = "Unable to save workout";
return View(viewModel);
}
}
Этот код рода работ при создании новых тренировок, однако, кажется, добавить повторяющиеся упражнения в базу данных. Я также не могу использовать это для редактирования существующих тренировок по мере получения следующей ошибки:
Оператор INSERT противоречил ограничениям FOREIGN KEY «FK_dbo.ExerciseRecords_dbo.Exercises_ExerciseId». Конфликт произошел в базе данных «WorkoutTracker», таблице «dbo.Exercise», в столбце «ExerciseId». Заявление было прекращено.
Я полагаю, что моя проблема в том, что, несмотря на объекты Exercise, связанные с каждым ExerciseRecord, уже существующим в базе данных, они должны быть привязаны к контексту, чтобы Entity Framework осознавала, что они уже существуют.
Am I по правильному пути с помощью этого метода, или есть более простой способ сделать то, что я пытаюсь сделать, которая в основном сводится к:
- Создание объекта тренировки
- Для каждого Тренировка, создать х числа объектов ExerciseRecord
- Для каждого объекта ExerciseRecord, связать один существующий объект Упражнения
Можете ли вы опубликовать свою структуру классов для упражнений, упражнений и тренировок? – drneel
Узнайте, что такое ExerciseIds, прежде чем пытаться сохранить. Ошибка внешнего ключа подразумевает, что вы пытаетесь вставить ExerciseId, который существует в таблице dbo.Exercise. – Gregg
Могу ли я с уверенностью предположить, что ваш 'unitOfWork' использует один экземпляр контекста для всех репозиториев? –