MVC实体框架 - 插入数据 - ReferentialConstraint中的依赖属性映射到存储生成的列

时间:2012-02-17 15:15:16

标签: asp.net-mvc entity-framework

我需要帮助尝试使用MVC和Entity Framework插入记录。我有一个动态创建的表单,可以包含很多问题。编辑时,我想删除现有答案(成功完成)并插入新答案。

我收到以下错误:
当IDENTITY_INSERT设置为OFF时,无法在表'tblModeratorReportAnswers'中为identity列插入显式值。

如果我在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);
}

我还检查了所有主键,外键,它们都没问题。主键都设置为'Is Identity'。

我一直试图整天解决这个问题。我不知道如何解决它。如果有人能给我任何建议,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

也许这是我对ASP.NET MVC和Entity Framework的经验不足,但我现在通过改变我更新报告的逻辑来解决这个问题。

而不是删除答案并重新插入它们。我现在检索答案并将Answer属性更改为新答案。然后使用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 });
}

答案 1 :(得分:0)

  

无法在表中插入identity列的显式值   当IDENTITY_INSERT设置为OFF时,'tblModeratorReportAnswers'。

此错误表示您正在将值显式插入自动生成的列(标识列)。

  

ReferentialConstraint中的依赖属性映射到a   存储生成的列。专栏:'AnswerID'。

此错误表示存在一些错误配置的关系,其中自动生成的AnswerID被视为FK - 不受支持。 IdentityComputed属性不得为FK。