2012-06-23 17 views
22

Otrzymuję ten błąd na EF.Błąd modułu Entity: Nie można wstawić jawnej wartości dla kolumny tożsamości w tabeli

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

W kolumnie DB przyrost tożsamość i pliku projektu EF StoreGeneratedPattern jest identity również. Wygląda na to, że EF próbuje wstawić 0 za każdym razem, gdy próbuję zapisać.

Niektóre sugestie mówią, że ID jest zarezerwowane dla tabel lub upuszczenie tabeli i ponowne uruchomienie skryptów.

Wszelkie pomysły?

Oto niektóre kodu:

GroupMember groupMember = new GroupMember(); 
      groupMember.GroupId = group.Id; 
      groupMember.UserId = (new UserId(group.Owner)); 
      //groupMember.Id = _groupContext.GroupMembers.Count(); 
      group.GroupMembers.Add(groupMember); 

      _groupContext.SaveChanges(); 

database

EF Designer

Odpowiedz

35

mam napotkasz tego wcześniej. Ten błąd oznacza, że ​​próbujesz przypisać wartość jawnie do kolumny, w której baza danych automatycznie ją przypisuje.

Sugestia: Zaktualizuj plik edmx, aby odzwierciedlić wszelkie zmiany wprowadzone w bazie danych. Jeśli baza danych automatycznie przydzieli wartość, w pliku projektanta pod tą właściwością powinien się znaleźć atrybut "IsDbGenerated = true". Jeśli go nie ma, możesz dodać go ręcznie.

+2

Rzeczywiście, aktualizacja edmx była rozwiązaniem. Dziękuję –

+2

w ef5 w projektancie edmx istnieje właściwość przeciwko polu o nazwie "StoreGeneratedPatern" - ustaw to na "Tożsamość" – timothy

18

Spróbuj tego:

using System.ComponentModel.DataAnnotations.Schema; 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public decimal Identity_Col { get; set; } 

Plik klasy Entity Framework dodaje te linie kodu do kolumny tożsamości.

+2

Ale to również generuje identyfikator. co, jeśli chcę sam określić wartość i użyć jej jako klucza głównego tabeli. –

+0

Najpierw używam kodu źródłowego EF, mam tabelę z kluczem złożonym, jedna kolumna to Tożsamość. Dodanie atrybutu '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' pracował dla mnie. –

3

W EF 6 istnieje właściwość pola/kolumny w modelu do wykonania tej czynności: StoreGeneratedPattern.

Ustaw na "Identity" na liście rozwijanej właściwości.

(nie wiem o EF 4. Powyższa odpowiedź, używając IsDbGenerated, wydaje się być dla EF 4.)

A ten odpowiada w podstawowej XML do atrybutu do elementu:

<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 

- ale nie musisz ręcznie zajmować się plikiem XML, ponieważ możesz używać projektanta.

Nie jest jasne, w jaki sposób jest to pomieszane. Miałem problem nawet po odświeżeniu mojego modelu z bazy danych. Być może jest to niejasne, jeśli ustawisz PK na stole lub zmienisz jego nazwę, po tym, jak już wygenerowałeś model. (Używam najpierw tabeli/bazy danych, a nie kodu.)

Nie można zastosować powyższego podejścia do umieszczania atrybutu C# na kodzie jednostki, ponieważ w tej sytuacji kod jednostki jest generowany przez EF . EF powinien rozumieć ("sam z siebie"), że to pole jest tożsamością.

8

Put tych attribs w górnej części nieruchomości, która jest tożsamość:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public int ID { get; set; } 
+0

Wygląda na to, że nie działa z usługami Azure Mobile Services. Mam model z tym jako pole: [Index (IsClustered = true)] [DatabaseGenerated (DatabaseGeneratedOption.Identity)] [TableColumnAttribute (TableColumnType.CreatedAt)] publicznych DateTimeOffset? CreatedAt {get; zestaw; } – WiteCastle

+2

Dodałem atrybut, a teraz dostaję ten błąd: "Właściwość zależna w ReferentialConstraint jest odwzorowana na kolumnę generowaną przez sklep" – Logar314159

+0

To działało idealnie dla mnie. Dzięki. –

3

Pierwszy mecz w google, więc tutaj moje rozwiązanie:

Kod EF pierwszy: Z powodu 'id' an autoinc PK pole I kolumnę prowadzącą, zaprojektowaną w następujący sposób:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid FileToken { get; set; } 

miała miejsce duplikacja tożsamości. Zmieniłem go na:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
[DefaultValue("newid()")] 
public Guid FileToken { get; set; } 

i problem zniknął.

Mam nadzieję, że to pomoże.

Erik

+0

Najpierw korzystam z kodu źródłowego EF, mam tabelę z kluczem złożonym, jedna kolumna to Tożsamość. Dodanie atrybutu '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' pracował dla mnie. –

0

Miałem ten problem w mojej aplikacji; i naprawiono go zmieniając właściwość "StoredGeneratedPattern" pola id na Identity.

Idź do modelu; poszukaj stołu; kliknij na propierties głównego pola klucza; i zmień właściwość.

Powiązane problemy