2016-11-16 12 views
3

私は外部キーで接続された3つのテーブルを持っています。質問テーブルに1行、他の2テーブルに2行を挿入しようとしています。 私はエラーを取得しています「外部キー制約を持つ挿入文の競合は」ヘルプエンティティに複数の関連テーブルを一度に挿入

public void setMultiAnswer() 
{ 
try 
{ 
    string question = "Question 1" 
    responsesList.Add("Answer1"); 
    responsesList.Add("Answer2"); 
    questionResponsesList.Add(false); 
    questionResponsesList.Add(true); 

    using (Entities testEntity = new Entities()) 
    { 
     Question questionObj = new Question(); 
     questionObj.Question1 = question; 
     questionObj.CreatedBy = "test"; 
     questionObj.CreatedDate = DateTime.Now; 

     QuestionRespons questionResponsesObj = new QuestionRespons(); 
     // fill response 
     foreach (var questionResponse in questionResponsesList) 
     { 
      questionResponsesObj.CorrectResponse = questionResponse; 
     } 

     questionObj.QuestionResponses.Add(questionResponsesObj); 

     Response responseObj = new Response(); 

     // fill response 
     foreach (var response in responsesList) 
     { 
      responseObj.Response1 = response; 
      responseObj.CreatedBy = "test"; 
      responseObj.CreatedDate = DateTime.Now; 
     } 
     questionResponsesObj.Response = responseObj; 

     testEntity.Questions.Add(questionObj); 
     testEntity.SaveChanges(); 
    } 
} 
catch (Exception ex) 
{ 
    Console.Write(ex); 
} 
+0

モデルコードを表示できますか? – Sampath

+0

ありがとう私はモデルの一部を追加しました。 – user6934713

答えて

2

あなたの質問IDが自動生成されたようですね、事前にありがとうございます。この場合 int questionId = questionObj.QuestionID;SaveChanges()コールの後にのみ機能します。

一般に、外部キーを持つEntitySetを使用している場合は、ID参照を自分で作成するのではなくナビゲーションプロパティを使用する方が簡単です。あなたの例に一致するように

Question questionObj = new Question(); 
questionObj.CreatedBy = "Test"; 
questionObj.CreatedDate = DateTime.Now; 

QuestionRespons questionResponsesObj = new QuestionRespons(); 
// fill question response here 
questionObj.QuestionResponses.Add(questionResponseObj); 

Response responseObj = new Response(); 
// fill your response here 
questionResponsesObj.Response = reponseObj; 
// if you do the above in your loop you should be fine 

testEntity.Questions.Add(questionObj); 
testEntity.SaveChanges(); 

public void setMultiAnswer() 
{ 
    try 
    { 
     string question = "Question 1" 
     responsesList.Add("Answer1"); 
     responsesList.Add("Answer2"); 
     questionResponsesList.Add(false); 
     questionResponsesList.Add(true); 

     using (Entities testEntity = new Entities()) 
     { 
      Question questionObj = new Question(); 
      questionObj.Question1 = question; 
      questionObj.CreatedBy = "Test"; 
      questionObj.CreatedDate = DateTime.Now; 
      testEntity.Questions.Add(questionObj); 

      for (int i = 0; i < responsesList.Count; i++) 
      { 
       // i am not sure about your relation here, but i assume you require one QuestionResponse per response 
       // which is why a moved the line of code 
       QuestionRespons questionResponsesObj = new QuestionRespons(); 
       questionObj.QuestionResponses.Add(questionResponsesObj); 

       Response responseObj = new Response(); 
       responseObj.Response1 = responsesList.ElementAt(i); 
       responseObj.CreatedBy = "Test"; 
       responseObj.CreatedDate = DateTime.Now; 

       if (!string.IsNullOrEmpty(responseObj.Response1)) 
       { 
        questionResponsesObj.Response = responseObj; 
        questionResponsesObj.CorrectResponse = questionResponsesList.ElementAt(i); 
       } 

      } 
      testEntity.SaveChanges(); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.Write(ex); 
    } 
} 
+0

ありがとうございます。レスポンステーブルにも挿入する必要があります。テーブルquestionResonsesは他の2つのテーブルの外部キーを持っています – user6934713

+0

私はサンプルを更新してレスポンスを生成しました。私は 'QuestionResponses'と' Reponse'の間の関係についてよく分かりません。 。 – jpk

1

変更

testEntity.SaveChanges(); 
int questionId = questionObj.QuestionID; 

int questionId = questionObj.QuestionID; 
testEntity.SaveChanges(); 

の順序デフォルトのIDを持っている必要があり、新しいインスタンスquestionObjを作成0.012のSaveChanges()を呼び出した後にのみ、新しく割り当てられた実際のID値をIDに割り当てる必要があります。

ここでは、questionIdを実際のIDの代わりに0のデフォルト値で覚えています。結論として、質問と回答の関係は常に間違っています。

+0

これは、アトミックプロセスを2つのトランザクションに分割します。 –

+0

@GertArnold合意に達しました!私はそのように実装しません。私はちょうど答えを短くし、完全なコードを完全に書き直すことなくしたいと思っていました。 –

1

私があなたの場合は、このQuestionResponseテーブルを削除して、質問と回答のみを保持します。外部キーを直接設定するのではなく、ナビゲーションプロパティを使用します。

Question questionObj = new Question 
    { 
     Text = question, 
     CreatedBy = "Test", 
     CreatedDate = DateTime.Now 
    }; 

    foreach(var response in responsesList.Where(x => !string.IsNullOrEmpty(x))) 
    { 
     Response responseObj = new Response 
     { 
      Text = response, 
      IsCorrect = true, 
      CreatedBy = "Test", 
      CreatedDate = DateTime.Now 
     } 

     questionObj.Add(responseObj); 
    } 

    testEntity.Questions.Add(questionObj); 
    testEntity.SaveChanges(); 
+0

質問応答も含めることができます – user6934713

+0

いいえ、 'QuestionResponse'エンティティはモデルから削除できませんが、FK値の代わりにナビゲーションプロパティを設定することは完全に正しいです! –

+0

あなたの提案に基づいてコードを変更しました(上記のコードをご覧ください)。しかし、私は2つではなく1つの質問応答と応答に入っています。 – user6934713

関連する問題