2013-04-29 15 views
18

Chcę wstawić nowy rekord do mojej tabeli SQL. Próbowałem:Wprowadź nowy obiekt do kontekstu z kluczem podstawowym tożsamości

 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 * Jestem zaskoczony, aby zobaczyć intellisense mi powiedzieć: „Zauważ, że nowy podmiot nie jest dodawana lub dołączone do zestawu”

Błąd brzmi:

"Naruszenie ograniczenia klucza głównego" PK_TableName ".Nie można wstawić duplikatu klucza w obiekcie" dbo.TableName ".Kopiowana wartość klucza to (0). \ R \ nPozdrawienie zostało zakończone."

Problemem jest to, że ma swój questionComment PK: questionComment.Id domyślnie 0. Musi to być następna dostępna Tożsamość lub w inny sposób nie wypełniona i "wstawić" normalną wstawkę.

W jaki sposób struktura encji oczekuje ode mnie obsłużenia tego scenerio?

zgodnie z żądaniem:

//------------------------------------------------------------------------------ 
// <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

Po wywołaniu 'SaveChanges()', 'newCommentObject. questionId' będzie zawierał nowo wygenerowany klucz przez bazę danych. – haim770

+0

@ haim770 - Zaktualizowałem pytanie z dokładnym błędem, który otrzymuję i lokalizacją błędu. Jeśli istnieje jakiś mechanizm lub zamówienie, które może rozwiązać ten problem, proszę zamieścić odpowiedź. –

+0

Zwykle robię coś takiego: moja "IDENTYFIKACJA" w bazie danych zaczyna się od 1 na górę; moje nowe jednostki w C# uzyskują "fałszywe" wartości PK od -1 w dół - te będą następnie zastępowane, gdy faktycznie wstawi się do tabeli (ale posiadające oddzielne, różne "fałszywe" wartości PK, upewnij się, że możesz pracować z jednostkami po prostu dobrze , a nawet odwoływać się do nich z innych obiektów!) –

Odpowiedz

33

Naprawiłem go:

  1. Idź do SQL i upewnij się, że w tabeli ma "Identity Specification"> Czy Identity> ustawiony na Tak. Następnie zaktualizuj plik * .edmx, jeśli musisz zmienić bazę danych.

  2. Sprawdzić * Właściwości .edmx> Entity> StoreGeneratedPattern dla tożsamości w celu zapewnienia, że ​​jest ona ustawiona na Tożsamości

enter image description here

+0

Stary, wydzierałem sobie włosy z tego samego błędu, nie zdawałem sobie sprawy, że nie utworzyłem kolumny tożsamości. Dzięki! (tak, wiem, komentarze "dziękuję" są mile widziane) –

+0

Dzięki temu człowiekowi, miałem ten sam problem, który mnie uratował! – Izekid

+0

Aktualizacja pliku .edmx nie działa dla mnie. Musiałem usunąć tabelę z pliku .edmx i ponownie ją dodać. – Ravvy

4

dokumentacja EF stwierdza, że ​​baza danych generuje wartość, gdy wiersz jest wstawiany do kolumn skonfigurowanych z propConfig.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)

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

Innymi słowy. EF nie będzie zwracać uwagi na wartość newCommentObject.Id podczas wstawiania do bazy danych. Zamiast tego pozwoli bazy danych na generowanie następnej wartości tożsamości.

+0

Nie jestem pewien, jak zastosować to do mojej sytuacji. Nie znam tej właściwości. Czy możesz pokazać, jak to dotyczy mojego pytania? Innymi słowy, kod, który demonstruje, jak naprawić błąd. –

+0

Prawdopodobnie skonfigurowałeś swoją tabelę pytań. Jeśli używałeś płynnego api EF, może to wyglądać jak 'modelBuilder.Entity () .HasKey (c =>/* * /);'. Możesz skonfigurować konfigurację tak, aby była "modelBuilder.Entity () .HasKey (c => c.Id/* Jeśli Id jest kluczem podstawowym dla tabeli * /);' lub do 'modelBuilder.Entity () .HasKey (c =>/* * /). Właściwość (c => c.Id) .HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity); ' Najprawdopodobniej zaleciłbym, aby Id na QuestionComments był kluczem podstawowym stół, ponieważ brzmi jak jest. –

Powiązane problemy