2012-02-17 3 views
0

MVCとEntity Frameworkを使用してレコードを挿入しようとすると助けが必要です。私は多くの質問を含むことができる動的に作成されたフォームを持っています。編集時には、既存の回答を削除して成功し、新しい回答を挿入します。MVC Entity Framework - データの挿入 - ReferentialConstraintの依存プロパティがストア生成カラムにマッピングされる

私は、次のようなエラーになっています:
をIDENTITY_INSERTがOFFに設定されているときに「tblModeratorReportAnswers」テーブルにID列の明示的な値を挿入することはできません。

私は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); 
} 

は、私はまた、すべての私の主キー、外部キーチェックしていると、彼らはすべてOKです。主キーはすべて「アイデンティティ」に設定されています。

私はこの問題を一日中解決しようとしています。私はそれを解決するために何をすべきか分かりません。誰かが私の助言を与えることができれば、それは非常に高く評価されるだろう。

答えて

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 }); 
} 
0

Cannot insert explicit value for identity column in table 'tblModeratorReportAnswers' when IDENTITY_INSERT is set to OFF.

このエラーは、明示的に自動生成された列(ID列)に値を挿入していることを示しています。サポートされていません -

A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'AnswerID'.

このエラーは、自動生成されたAnswerIDがFKと考えられているいくつか間違って設定関係があることを述べています。 IdentityおよびComputedプロパティはFKであってはなりません。

+0

ご回答ありがとうございます。なぜ私のコードのどこにでも 'AnswerID'を設定していないので、最初のエラーが出ていた理由は分かりません。私のコードをステップ実行するときにプロパティの上にマウスを移動すると、値は0になります。これが問題の原因になりますか?私は解決策を探してDbContextの行を追加しましたが、これは可能な解決策として提案されました。 –

+1

外部キーとしてID列を削除しましたが、まだエラーメッセージが表示されています。他に何ができるのか分かりますか?私は完全にこの1つに困惑しています。 –

関連する問題