2013-04-29 7 views
18

Ich möchte einen neuen Datensatz in meine SQL-Tabelle einfügen. Ich habe versucht:Neue Entität in Kontext mit Identitätsprimärschlüssel einfügen

 public void CreateComment(int questionId, string comment) 
     { 
      QuestionComment questionComment = context.TableName.Create();//1* 
      questionComment.propertyThatIsNotAConstraint= questionId; 
      questionComment.body = comment; 
      context.QuestionComments.Add(questionComment); 
      context.SaveChanges();//ERROR... 
     } 

1 * Ich bin überrascht, mich zu sehen intellisense sagen: „Beachten Sie, dass die neue Einheit wird auf die Menge nicht hinzugefügt oder befestigt“

Fehler Liest:

"Verletzung der PRIMARY KEY-Einschränkung 'PK_TableName'. Kann keinen doppelten Schlüssel im Objekt 'dbo.TableName' einfügen. Der doppelte Schlüsselwert ist (0). \ R \ nDie Anweisung wurde beendet."

Das Problem ist, dass questionComment seine PK hat: questionComment.Id-0 Verzug geraten. Es muss die nächste verfügbare Identität sein oder anderweitig nicht ausgefüllt sein und eine "normale" Identität einfügen.

Wie erwartet Entity Framework, dass ich mit diesem Szenario handle?

wie gewünscht:

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

    namespace Feedback.Models 
    { 
     using System; 
     using System.Collections.Generic; 

     public partial class QuestionComment 
     { 
      public int id { get; set; } 
      public int questionId { get; set; } 
      public string body { get; set; } 
      public int commentIndex { get; set; } 
     } 
    } 
+1

Nach dem Aufruf von 'Savechanges()', 'newCommentObject. questionId' wird den neu generierten Schlüssel von der Datenbank enthalten. – haim770

+0

@ haim770 - Ich habe die Frage mit dem genauen Fehler, den ich erhalte, und dem Ort des Fehlers aktualisiert. Wenn es einen Mechanismus oder eine Reihenfolge gibt, die das beheben kann, posten Sie bitte eine Antwort. –

+0

Normalerweise mache ich so etwas: Meine 'IDENTITY' in der Datenbank geht von 1 auf; Meine neuen Entitäten in C# erhalten "gefälschte" PK-Werte von -1 abwärts - diese werden dann ersetzt, wenn die tatsächliche Einfügung in die Tabelle erfolgt (aber getrennte, unterschiedliche "gefälschte" PK-Werte stellen sicher, dass Sie mit den Entitäten gut arbeiten können) und verweisen sie sogar von anderen Entitäten!) –

Antwort

33

ich es von fixed:

  1. Zum SQL und stellen Sie sicher, die „Identität Spezifikation“ der Tabelle hat> Ist Identität> auf Ja festgelegt. Aktualisieren Sie dann die * .edmx-Datei, wenn Sie eine DB-Änderung vornehmen müssen.

  2. Überprüfen Sie die * .edmx> Objekteigenschaften> StoreGeneratedPattern für die Identität, um sicherzustellen, dass es zu Identität gesetzt

enter image description here

+0

Alter, ich raufte mir die Haare mit dem gleichen Fehler, wusste nicht, dass ich keine Identitätssäule erstellt hatte. Vielen Dank! (Ja, ich weiß, "Danke" Kommentare sind verpönt) –

+0

Danke Mann, ich hatte das gleiche Problem, das Sie mir gerettet haben! – Izekid

+0

Das Aktualisieren der EDMX-Datei funktionierte nicht für mich. Ich musste die Tabelle aus der .edmx löschen und neu hinzufügen. – Ravvy

4

EF Dokumentation besagt, dass die Datenbank einen Wert erzeugt, wenn eine Zeile für Spalten mit propConfig.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)

http://msdn.microsoft.com/en-us/library/hh829109(v=vs.103).aspx

Mit anderen Worten konfiguriert eingesetzt ist. EF ist es egal, welchen Wert newCommentObject.Id beim Einfügen in die Datenbank hat. Stattdessen kann die Datenbank den nächsten Identitätswert generieren.

+0

Ich weiß nicht, wie ich das auf meine Situation anwenden soll. Ich kenne diese Eigenschaft nicht. Kannst du zeigen, wie das auf meine Frage zutrifft? Mit anderen Worten, Code, der zeigt, wie der Fehler behoben werden kann. –

+0

Vermutlich haben Sie Ihre QuestionComments-Tabelle eingerichtet. Wenn Sie die fliessende API von EF benutzt haben, kann es aussehen wie 'modelBuilder.Entity () .HasKey (c =>/* * /);'. Sie könnten das Setup so modifizieren, dass es 'modelBuilder.Entity () .HasKey (c => c.Id/* Wenn Id der Primärschlüssel für die Tabelle * /) ist;' oder zu 'modelBuilder.Entity () .HasKey (c =>/* * /). Eigenschaft (c => c.Id) .HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity); ' Ich würde wahrscheinlich empfehlen, Id auf QuestionComments den Primärschlüssel der Tisch, weil es so klingt wie es ist. –

Verwandte Themen