MVC Entity Framework - Вставка данных - Зависимое свойство в ReferentialConstraint отображается в столбец, сгенерированный хранилищем - PullRequest
0 голосов
/ 17 февраля 2012

Мне нужна помощь при попытке вставить запись, используя MVC и Entity Framework.У меня есть динамически созданная форма, которая может содержать много вопросов.При редактировании я хочу удалить существующие ответы (что он делает успешно) и вставить новые ответы.

Я получаю следующую ошибку:
Невозможно вставить явное значение для столбца идентификации в таблице 'tblModeratorReportAnswers 'когда для IDENTITY_INSERT установлено значение OFF.

Если я добавлю следующую строку в мой класс DbContext
modelBuilder.Entity<QuestionAnswer>().Property(p => p.AnswerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);, я получу эту ошибку:
Зависимое свойство вReferentialConstraint отображается в столбец, созданный магазином.Колонка: 'AnswerID'.

Вот мой код, который выполняет обновление

//
// POST: /Home/Edit/1
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection formCollection, int moderatorReportId)
{
    ModeratorReport reportToEdit = repository.GetModeratorReportById(moderatorReportId);
    List<QuestionAnswer> originalReportAnswers = repository.GetAllModeratorReportAnswers(moderatorReportId).ToList();

    foreach (QuestionAnswer answer in originalReportAnswers) {
        repository.DeleteAnswer(answer);
    }

    repository.Save();

    int sectionID;
    int questionID;

    foreach (string key in formCollection.AllKeys)
    {
        var value = formCollection[key.ToString()];

        Match m = Regex.Match(key, "section(\\d+)_question(\\d+)");

        if (m.Success) {
            QuestionAnswer newAnswer = new QuestionAnswer();

            sectionID = Convert.ToInt16(m.Groups[1].Value.ToString());
            questionID = Convert.ToInt16(m.Groups[2].Value.ToString());

            newAnswer.ModeratorReportID = moderatorReportId;
            newAnswer.QuestionID = questionID;
            newAnswer.Answer = value;
            repository.AddAnswer(newAnswer);
        }
    }

    repository.Save();

    reportToEdit.Status = "SUBJECTOFFICER SAVED";

    AuditItem auditItem = new AuditItem();
    auditItem.ModeratorReportID = moderatorReportId;
    auditItem.Status = "SUBJECTOFFICER SAVED";
    auditItem.AuditDate = DateTime.Now;
    auditItem.Description = "The Moderator report ID: " + moderatorReportId + " was saved.";
    auditItem.UserID = User.Identity.Name;

    db.Audit.Add(auditItem);

    repository.Save();

    return RedirectToAction("Details", new { id = moderatorReportId });
}

... и в моем хранилище

//
// Persistance

public void Save()
{
    db.SaveChanges();
}

public void AddAnswer(QuestionAnswer answer)
{
    db.Answers.Add(answer);
    Save();
}

public void DeleteAnswer(QuestionAnswer answer) 
{
    db.Answers.Attach(answer);
    db.Answers.Remove(answer);
}

У меня естьтакже проверил все мои первичные ключи, иностранные ключи, и все они в порядке.Все первичные ключи установлены на «Идентичность».

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

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Может быть, это моя неопытность в ASP.NET MVC и Entity Framework, но теперь я решил эту проблему, изменив логику обновления отчета.

Вместо удаления ответов и их повторной вставки. Теперь я получаю ответы и изменяю свойство «Ответ» на новый ответ. Тогда просто используйте db.SaveChanges ().

//
// POST: /Home/Edit/1
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection formCollection, int moderatorReportId)
{
    ModeratorReport reportToEdit = repository.GetModeratorReportById(moderatorReportId);
    List<QuestionAnswer> originalReportAnswers = repository.GetAllModeratorReportAnswers(moderatorReportId).ToList();

    int sectionID;
    int questionID;

    foreach (string key in formCollection.AllKeys)
    {
        var value = formCollection[key.ToString()];

        Match m = Regex.Match(key, "section(\\d+)_question(\\d+)");

        if (m.Success) {
            QuestionAnswer newAnswer = new QuestionAnswer();

            sectionID = Convert.ToInt16(m.Groups[1].Value.ToString());
            questionID = Convert.ToInt16(m.Groups[2].Value.ToString());

            foreach(QuestionAnswer answerToEdit in originalReportAnswers) {
                if (answerToEdit.QuestionID == questionID)
                {
                    answerToEdit.Answer = value;
                }
            }
        }
    }

    repository.Save();

    reportToEdit.Status = "SAVED";

    AuditItem auditItem = new AuditItem();
    auditItem.ModeratorReportID = moderatorReportId;
    auditItem.Status = "SAVED";
    auditItem.AuditDate = DateTime.Now;
    auditItem.Description = "The Moderator report ID was saved.";
    auditItem.UserID = User.Identity.Name;

    db.Audit.Add(auditItem);

    repository.Save();

    return RedirectToAction("Details", new { id = moderatorReportId });
}
0 голосов
/ 17 февраля 2012

Невозможно вставить явное значение для столбца идентификаторов в таблице 'tblModeratorReportAnswers', когда для IDENTITY_INSERT установлено значение OFF.

Эта ошибка говорит о том, что вы явно вставляете значение в автоматически сгенерированный столбец (столбец идентификаторов).

Зависимое свойство в ReferentialConstraint отображается на сгенерированный магазином столбец. Колонка: «AnswerID».

Эта ошибка говорит о том, что существует некоторое неправильно настроенное отношение, в котором автоматически сгенерированный AnswerID считается FK - это не поддерживается. Свойства Identity и Computed не должны быть FK.

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