web-dev-qa-db-fra.com

Erreur Entity Framework: impossible d'insérer une valeur explicite pour la colonne d'identité dans la table

Je reçois cette erreur sur EF.

Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'GroupMembers_New' lorsque IDENTITY_INSERT est défini sur OFF.

La colonne sur la base de données est l'incrément d'identité et dans le fichier de conception EF, StoreGeneratedPattern est également identity. Il semble que EF essaie d'insérer 0 à chaque fois que j'essaie d'enregistrer.

Certaines suggestions indiquent que l'ID est réservé sur les tables ou supprimez la table et réexécutez les scripts.

Des idées?

Voici du 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

41
Homero Barbosa

J'ai déjà rencontré ça auparavant. Cette erreur signifie que vous essayez d'affecter une valeur explicitement à une colonne où la base de données l'attribue automatiquement.

Suggestion: mettez à jour votre fichier edmx pour refléter toutes les modifications que vous avez apportées à la base de données. Si la base de données attribue automatiquement la valeur, vous devriez voir l'attribut "IsDbGenerated = true" dans votre fichier de concepteur sous cette propriété. S'il n'est pas là, vous pouvez l'ajouter manuellement.

55
ems305

Essaye ça:

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

Le fichier de classe Entity Framework ajoute ces lignes de code à la colonne Identité.

27
thomas

Mettez ces attributs au-dessus de la propriété qui est l'identité:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
15
Amin Saqi

Premier match dans google, voici donc ma solution:

Code EF en premier: en raison d'un champ 'ID' PK auto-incrémenté ET d'une colonne guid, concevoir comme ceci:

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

il y avait une identité en double. Je l'ai changé en:

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

et le problème a disparu.

J'espère que cela vous aide.

Erik

6
Erik

Dans EF 6, il existe une propriété du champ/colonne dans votre modèle pour ce faire: StoreGeneratedPattern.

Réglez-le sur "Identité" dans la liste déroulante des propriétés.

(Je ne sais pas pour EF 4. La réponse ci-dessus, en utilisant IsDbGenerated, semble être pour EF 4.)

Et cela correspond dans le XML sous-jacent à un attribut à l'élément:

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

--mais vous n'avez pas besoin de traiter le XML manuellement, car vous pouvez utiliser le concepteur.

Comment cela est gâché n'est pas clair. J'ai eu le problème même après avoir actualisé mon modèle à partir de la base de données. Peut-être que cela devient confus si vous définissez le PK sur la table, ou changez son nom, après avoir déjà généré le modèle. (J'utilise l'approche table/base de données d'abord, pas le code d'abord.)

Vous ne pouvez pas utiliser l'approche ci-dessus de placer l'attribut C # sur le code d'entité, car dans cette situation, le code d'entité est généré par EF. EF est censé comprendre ("par lui-même") que le champ est une identité.

3
Smitty

J'ai eu ce problème dans mon application; et je l'ai corrigé en changeant la propriété "StoredGeneratedPattern" du champ id en Identity.

Alors, allez au modèle; recherchez la table; cliquez sur les propriétés du champ de clé primaire; et changer la propriété.

1
Charly N

J'ai rencontré le même problème et le même message d'erreur dans mon application AspNetCore 2.x. La seule façon de le résoudre était de supprimer cette ligne dans la méthode ModelBuilder.Entity de la classe DbContext:

// remove: entity.Property(e => e.Id).ValueGeneratedNever();
0
Red Feet