2 таблицы, получить идентификатор из одной таблицы и добавить значение в другую таблицу, но с идентификатором - PullRequest
0 голосов
/ 08 мая 2018

Мое веб-приложение о сетевом пуле, оно имеет Model.Question и Model.Answer.

В вопросе у меня есть Id, Text (значение вопроса), List of Answers, StartDate, EndDate и, если это active.

В модели ответа у меня есть Id, QuestionId, Text (значение ответа) и Votes (не хочу использовать его сейчас)

У меня возникают проблемы при получении значения из Вопроса (Id), поэтому у Answer.QuestionId есть его Идентификатор. Затем мне нужно добавить Model.Answer.Text к Question.Answer;

Вот мой контроллер:

public ActionResult AddAnswer(int id)
{
        //return View();
        using (var poolDbContext = new PoolContext())
        {
            Answer answer = poolDbContext.Answers.Find(id);
            return View(answer);
        }
}

[HttpPost, ActionName("AddAnswer")]
[ValidateAntiForgeryToken]
public ActionResult AddAnswerPost([Bind("Id, Answers")] Question question, Answer answer)
{
        try
        {
            if (ModelState.IsValid)
            {
                using (var poolDbContext = new PoolContext())
                {
                    answer.QuestionId = question.Id;
                    poolDbContext.Answers.Add(answer);
                    question.Answers.Add(answer);
                    repository.Add(question);
                    repository.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
        }
        catch (DbUpdateException /* ex */)
        {
            //Log the error (uncomment ex variable name and write a log.
            ModelState.AddModelError("", "Unable to save changes. " +
                "Try again, and if the problem persists " +
                "see your system administrator.");
        }

        return View(answer);
}

1 Ответ

0 голосов
/ 08 мая 2018

Итак, вы можете изменить свой код (для краткости опущен оставшийся контроллер) на что-то вроде этого:

using (var poolDbContext = new PoolContext())
{
    // get the question from db, also including the answers
    var questionFromDb = poolDbContext.Questions
    .Include(q => q.Answers)
    .Single(q => q.Id == question.Id);

    // good idea to validate if the question exists..
    if (questionFromDb == null)
        throw new ArgumentException("Question not found.");

    // if answer is a new answer and not an update, 
    // then just add it to the current answers.
    answer.QuestionId = questionFromDb.Id;
    questionFromDb.Answers.Add(answer);

    // dbContext is tracking changes, so you don't need to add to the dbSet.
    repository.SaveChanges();

    return RedirectToAction("Index");
}

Но .. это предполагает некоторые вещи:

  • Идентификатор на Answer является целым числом с автоматической настройкой приращения. Если это так, то это будет работать. Если это, например, Guid, то сначала нужно создать Id, так что имейте это в виду.
  • У вас есть repository, который я не знаю, что это такое. Но, поскольку вы используете dbContext прямо здесь, я не вижу смысла в этом, поэтому полностью игнорируется в моем решении

И .. еще один совет для вас:

  • Не используйте ваши EF-сущности в качестве типов для действий вашего контроллера. Вместо этого создайте несколько ViewModels. Объекты EF могут быть сложными, и в большинстве случаев ваши клиенты работают только с его частями. Поэтому рекомендуется использовать другой тип для возврата / публикации ваших действий. Подробнее здесь
  • В общем, вы можете ввести DbContext в свой контроллер. Таким образом, вам не нужно создавать его экземпляр в контроллере, а его временем жизни управляет система DI (, если вы правильно настроили )
  • Также проверьте глобальную обработку исключений. В сети есть куча ресурсов ... но в основном вам нужно избегать try / catch в вашем контроллере с повторяющейся обработкой исключений.

Надеюсь, это поможет немного прояснить ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...