2012-06-23 5 views
22

Ich bekomme diesen Fehler auf EF.Entity Framework-Fehler: Kann keinen expliziten Wert für Identitätsspalte in Tabelle einfügen

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

Die Spalte auf der Db Identität Schritt und auf der EF Design-Datei, StoreGeneratedPattern ist identity auch. Sieht so aus, als ob EF versucht, jedes Mal, wenn ich versuche zu speichern, 0 einzufügen.

Einige Vorschläge besagt, dass ID für Tabellen reserviert ist oder die Tabelle löschen und die Skripts erneut ausführen.

Irgendwelche Ideen?

Hier einige Code:

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

Antwort

35

ich in diese vor ausgeführt haben. Dieser Fehler bedeutet, dass Sie versuchen, einen Wert explizit einer Spalte zuzuweisen, in der die Datenbank sie automatisch zuweist.

Vorschlag: Aktualisieren Sie Ihre EDMX-Datei, um etwaige Änderungen in der Datenbank widerzuspiegeln. Wenn die Datenbank den Wert automatisch zuweist, sollten Sie das Attribut "IsDbGenerated = true" in Ihrer Designer-Datei unter dieser Eigenschaft sehen. Wenn es nicht vorhanden ist, können Sie es manuell hinzufügen.

+2

Tatsächlich war die Aktualisierung der edmx die Lösung. Vielen Dank –

+2

in ef5 im edmx Designer gibt es eine Eigenschaft gegen das Feld namens 'StoreGeneratedPatern' - setzen Sie dies auf 'Identität' – timothy

18

Versuchen Sie folgendes:

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

Entity Framework-Klassendatei fügt diese Zeilen Code in die Identitätsspalte.

+2

Aber dies erzeugt auch die ID. Was wäre, wenn ich den Wert selbst angeben und als Primärschlüssel der Tabelle verwenden möchte. –

+0

Zuerst verwende ich EF Core-Code, ich habe eine Tabelle mit einem zusammengesetzten Schlüssel, eine Spalte ist Identity. Das Hinzufügen des Attributs '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' funktionierte für mich. –

3

In EF 6 gibt es eine Eigenschaft des Felds/Spalte in Ihrem Modell dafür: StoreGeneratedPattern.

Setzen Sie dies auf "Identität" in der Eigenschaft Dropdown-Liste.

(Ich weiß nicht, über EF 4. Die oben genannte Antwort, mit IsDbGenerated, scheint für EF 4. zu sein)

Und dies entspricht in dem zugrunde liegenden XML in ein Attribut für das Element:

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

- aber Sie müssen nicht mit dem XML manuell umgehen, da Sie den Designer verwenden können.

Wie dies durcheinander gebracht wird ist nicht klar. Ich hatte das Problem, nachdem ich mein Modell aus der Datenbank aktualisiert hatte. Vielleicht wird es verwirrt, wenn Sie den PK auf den Tisch legen oder seinen Namen ändern, nachdem Sie das Modell bereits generiert haben. (Ich verwende den ersten Ansatz der Tabelle/Datenbank, nicht den Code zuerst.)

Sie können den obigen Ansatz nicht verwenden, um das C# -Attribut auf den Entitätscode zu setzen, da in dieser Situation der Entitätscode von EF generiert wird . EF soll ("von selbst") verstehen, dass das Feld eine Identität ist.

8

Setzen Sie diese attribs oben auf die Eigenschaft, die Identität ist:

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

Dies scheint mit Azure Mobile Services nicht zu funktionieren. Ich habe ein Modell mit diesem als ein Feld: [Index (IsClustered = wahr)] [DatabaseGenerated (DatabaseGeneratedOption.Identity)] [TableColumnAttribute (TableColumnType.CreatedAt)] public DateTimeOffset? CreatedAt {erhalten; einstellen; } – WiteCastle

+2

Ich habe das Attribut hinzugefügt, und jetzt erhalte ich diesen Fehler: "Eine abhängige Eigenschaft in einer ReferentialConstraint wird einer speichergenerierten Spalte zugeordnet" – Logar314159

+0

Dies funktionierte perfekt für mich. Danke. –

3

Erstes Spiel in google, so hier meine Lösung:

EF-Code zuerst: Wegen eines AutoInc PK 'id' Feld UND eine GUID-Spalte, Design wie folgt:

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

gab es eine doppelte Identität. Ich änderte es zu:

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

und das Problem ging weg.

Ich hoffe, es hilft Ihnen.

Erik

+0

Zuerst verwende ich EF Core-Code, ich habe eine Tabelle mit einem zusammengesetzten Schlüssel, eine Spalte ist Identity. Das Hinzufügen des Attributs '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' funktionierte für mich. –

0

Ich hatte dieses Problem in meiner App; und wurde behoben, indem die Eigenschaft "StoredGeneratedPattern" des ID-Feldes in Identity geändert wurde.

Gehen Sie also zum Modell; schau nach dem Tisch auf; Klicken Sie auf Eigenschaften des Primärschlüsselfeldes; und ändern Sie die Eigenschaft.

Verwandte Themen