2016-11-16 2 views
3

Ich habe drei Tabellen, die durch Fremdschlüssel verbunden sind. Ich versuche, 1 Zeile in der Fragetabelle und zwei Zeilen in den anderen zwei Tabellen einzufügen. Ich erhalte die Fehlermeldung ‚Anweisung Einfügen Konflikt mit Fremdschlüssel‘ Vielen Dank im Voraus für die HilfeMehrere zusammenhängende Tabellen in Entity auf einmal einfügen

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

Können Sie den Modellcode anzeigen? – Sampath

+0

Vielen Dank Ich habe den Teil des Modells hinzugefügt. – user6934713

Antwort

2

Es klingt wie Ihre Frage id automatisch generiert wird. In diesem Fall funktioniert int questionId = questionObj.QuestionID; nur nach dem SaveChanges() Anruf.

Im Allgemeinen, wenn Sie ein EntitySet mit Fremdschlüsseln haben, ist es einfacher, die Navigationseigenschaften zu verwenden, anstatt ID-Referenzen selbst zu erstellen.

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(); 

Ihr Beispiel entsprechen:

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

Danke. Ich muss auch in die Tabelle Antwort einfügen. Und die Tabelle questionResonses hat Fremdschlüssel aus den anderen beiden Tabellen – user6934713

+0

Ich habe das Beispiel auf inculde Response aktualisiert, ich bin mir nicht sicher über Ihre Beziehung zwischen 'QuestionResponses' und' Reponse' weshalb ich Ihre for-Schleife nicht im Beispiel eingeschlossen habe . – jpk

1

Ändern der Reihenfolge der

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

in

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

Sie eine neue Instanz questionObj erstellt, die eine Standard-ID haben sollte von 0 Erst NACH dem Aufruf von SaveChanges() sollte der ID der neu zugewiesene tatsächliche ID-Wert zugewiesen werden.

Also, was passiert hier, ist, dass Sie questionId mit dem Standardwert von 0 anstelle der realen ID auswendig lernen. Folglich werden die Beziehungen zwischen Fragen und Antworten immer falsch sein.

+0

Dies teilt einen atomaren Prozess in zwei Transaktionen - nicht gut. –

+0

@GertArnold Einverstanden! Ich würde es auch nicht so umsetzen. Ich wollte nur die Antwort kurz halten und den kompletten Code nicht komplett neu schreiben. –

1

Wenn ich Sie wäre, würde ich diese QuestionResponse-Tabelle entfernen, um nur Frage und Antwort zu behalten. Verwenden Sie die Navigationseigenschaften, anstatt den Fremdschlüssel direkt festzulegen.

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

Wie kann ich die Frage Antwort auch – user6934713

+0

Nein, die 'QuestionResponse' Einheit kann nicht aus dem Modell entfernt werden, aber die Einstellung Navigationseigenschaften anstelle von FK-Werte ist völlig korrekt! –

+0

Ich habe den Code entsprechend Ihrem Vorschlag geändert (Sie können den Code oben sehen). Aber ich gebe nur eine Frage einReaktion und Antwort statt zwei. – user6934713

Verwandte Themen