2010-05-17 7 views
10

J'ai une application Web MVC avec une table dans le modèle que je voudrais ajouter. J'ai la clé primaire définie avec les autres champs de données, mais chaque fois que j'essaie d'ajouter à la table, j'obtiens l'erreur suivante:IDENTITY_INSERT est défini sur erreur

"Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table" NOM_PAYE "lorsque IDENTITY_INSERT est réglé sur OFF. " Je ne suis pas sûr de la raison de ce problème, j'ai la clé primaire définie comme identité et elle est également définie sur auto increment dans le concepteur de table Visual Studio. Est-il possible que je puisse ajuster le paramètre IDENTITY_INSERT dans le concepteur de table dans Visual Studio? Ou y a-t-il un autre problème qui pourrait en être la cause.

MISE À JOUR: @Brian - Pour autant que je sache, je ne définis pas la valeur explicitement, voici le code qui s'ajoute à la table (s).

//Add viewer 
public void addViewer(ModelStateDictionary modelState, Users user) 
{ 
    var userToAdd = new UserRoles(); 
    userToAdd.Users = user; 

    if (String.IsNullOrEmpty(userToAdd.Users.Username)) 
    { 
     modelState.AddModelError("noName", "Please enter a username for the new Viewer"); 
    } 

    //See if Committee Member already exists 
    try 
    { 
     userToAdd = _db.UserRoles.First(ur => ur.Users.Username == userToAdd.Users.Username); 
     modelState.AddModelError("userExists", "A Viewer with that username already exists in the system"); 
     return; 
    } 
    catch (Exception e) 
    { 
     if (modelState.IsValid) 
     { 
      //Assign Committee Member role 
      userToAdd.Role = "Viewer"; 
      userToAdd.Users = user; 
      //Add new Committee Member to User Roles and associated username to Users 
      _db.AddToUserRoles(userToAdd); 
      _db.SaveChanges(); 
     } 
    } 
} 
+0

Vérifiez vos paramètres/propriétés sur la table en question dans votre LINQ to SQL Designer - vous devez vous assurer certains réglages spécifiques - voir ma réponse pour plus de détails. –

+0

Juste édité le '* .edmx' pour changer la valeur correspondant à ma clé primaire de' '' ' '. Il s'agissait simplement d'ajouter l'attribut avec sa valeur: 'StoreGeneratedPattern =" Identity "'. –

Répondre

5

Vous essayez de définir explicitement une valeur de clé primaire probablement dans l'entité LINQ; vous essayez de dire, par exemple, insérer 1 dans le champ de clé primaire qui est une identité, et LINQ voit cela comme une valeur insérée.

Également si vous utilisez LINQ to SQL, dans le type de données du champ du serveur, assurez-vous qu'il indique IDENTITY dans le champ de type de données; s'il ne dit pas IDENTITY, il peut y avoir une erreur de configuration dans LINQ.

+0

+1 C'est ce que je voulais faire. =) (Language barrière =() –

+0

Je suis en train d'utiliser LINQ-to-Entities pour mon modèle – kingrichard2005

+0

StoreGeneratedPattern devrait dire Identity pour LINQ to Entities, au moins pour 4.0. N'a pas utilisé beaucoup 1.0 –

14

Il semblerait que votre code tente d'insérer une valeur spécifique dans la colonne de clé primaire définie comme IDENTITY.

Pour éviter l'erreur - ne pas insérer de valeurs! Laissez la base de données gérer obtenir une nouvelle valeur pour la ligne que vous insérez.

Si vous utilisez LINQ to SQL, cliquez sur la table en question dans votre concepteur visuel, et un regard sur les propriétés:

alt text http://i39.tinypic.com/bgzs6d.png

La « valeur générée automatiquement » doit être "True" (ce qui n'est pas le cas par défaut), et la synchronisation automatique devrait être "OnInsert" (encore une fois: pas la valeur par défaut). En outre, définissez la "Clé primaire" sur true et vérifiez que le "Type de données du serveur" est correct - Int NOT NULL IDENTITY (ou quelque chose comme ça).

Si jamais vous devez remplacer le comportement par défaut (généralement uniquement dans les scripts de nettoyage ou les manipulations de données ponctuelles), vous pouvez activer IDENTITY_INSERT sur une table, par ex. après cela, vous pouvez insérer une valeur quelconque dans la colonne IDENTITY:

SET IDENTITY_INSERT YourTableName ON 

INSERT INTO YourTableName(IdentityColumn) VALUES(5555) 

SET IDENTITY_INSERT YourTableName OFF 

Ceci est plus d'un nettoyage/données type admin de tâche - pas quelque chose que vous devez faire tout le temps en tant que dev.

+0

J'ai essayé à droite cliquer sur la table dans le concepteur du studio de gestion de serveur mssql mais je n'ai rien vu comme vous l'avez fait.J'ai exécuté la requête pour activer l'insertion d'identité mais cela n'a pas aidé mon code à insérer par programme dans la table – obesechicken13

+0

Je ne vois pas d'options pour "clé primaire" seulement "clé d'entité" Je vois le type Je ne vois aucun des autres paramètres en gras que vous voyez. – obesechicken13

4

Merci à tous pour vos suggestions, j'ai fini par résoudre mon problème en faisant un rafraîchissement du modèle. Mon modèle avait été créé avant que je mette la clé primaire à la spécification d'identité avec l'auto-incrémentation, donc je suppose que tout ce dont il avait besoin était un rafraîchissement pour le faire fonctionner.

0

J'ai eu ce problème et l'ai résolu en supprimant la colonne d'identité du modèle. Cela l'a effacé

1

Si vous utilisez LinQ to SQL, supprimez votre table du fichier .edmx en cliquant avec le bouton droit de la souris sur la table et en sélectionnant l'option "Supprimer du modèle". Mettez à jour votre fichier .edmx en cliquant avec le bouton droit de la souris sur le fichier .edmx et en sélectionnant l'option "Mettre à jour le modèle depuis la base de données ...".

Son travail pour me..Try .. il

Questions connexes