Des problèmes avec IDENTITY_INSERT Mettre à OFF? : – /

J'essaye d'insert des détails de command dans ma database, et il continue à dire:

Impossible d'insert une valeur explicite pour la colonne d'identité dans la table "Orders" lorsque IDENTITY_INSERT est défini sur OFF.

Tout ce que j'essaie de faire est simplement d'insert les users UserId dans la colonne UserId, en utilisant WebSecurity.CurrentUserId – Pourquoi cela ne fonctionne-t-il pas?

J'ai:

 dbase.Execute("INSERT INTO Orders (UserId, OrderId, Status) VALUES (@0, @1, @2)", WebSecurity.CurrentUserId, Session["OSFOID"], "Confirmed");` 

Donc, comme vous pouvez le voir, c'est assez simple. Mais, pourquoi ça ne marchera pas?

Ma définition de table est:

Définition de la table

Si vous n'autorisez pas l'option identity-insert (en définissant identity-insert sur cette table), vous n'êtes PAS AUTORISÉ pour toucher cette colonne – la database en est propriétaire.

Activez brièvement l' insertion d'identité, ou: n'essayez pas d'insert l'ID user (laissez le DB créer un nouvel ID).

Selon les livres en ligne, SET IDENTITY_INSERT :

 SET IDENTITY_INSERT Orders ON INSERT INTO Orders (UserId, OrderId, Status) VALUES (@0, @1, @2) SET IDENTITY_INSERT Orders OFF 

Plus probable, cependant: si c'est la table Orders , l'identité ne devrait-elle pas être sur OrderId ? Vous auriez toujours le même problème puisque vous essayez de contrôler le OrderId , bien sûr.

Généralement, vous ne voudriez pas insert un entier dans une colonne de key primaire. Vous devez généralement définir l'indicateur "Identity" de la colonne sur true uniquement lorsque vous souhaitez que SQL Server définisse un entier auto-incrémenté dans cette colonne lors de l'insertion.

Comme avec la réponse de Marc Gravell, vous pouvez activer l'insertion d'identité en utilisant

 SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF } 

Mais le faire dans le code d'application normal est vraiment malsain – vous vous refindez avec des problèmes de concurrency et des identités en double. Mieux, n'introduisez pas l'ID de la command – laissez la DB le faire pour vous automatiquement, puis requestz simplement le nouvel ID en utilisant @@IDENTITY (ou mieux, SCOPE_IDENTITY() ).

Si, pour une raison quelconque, vous devez absolument stocker l'identifiant de session de l'user, faites-en une colonne distincte dans la table des commands, ou mieux, dans une table user distincte, avec UserId étant une key étrangère.

Vous ne voulez pas que l'ID user soit une identité et je ne pense pas non plus que vous voulez que l'ID user soit la key primaire non plus. Plus que probablement, vous voulez que la command principale soit la key primaire ou, au mieux, la key primaire partagée avec l'ID user et le code d'identification.

Dans l'set de définitions de votre tableau, Is Identity? comme False , sans paramètre que vous ne pouvez pas insert manuellement une valeur dans l' UserID

Vous avez défini l' identité de SI sur OUI, c'est pourquoi maintenant vous ne pouvez pas insert de valeur pour cette colonne. DB l'inserta automatiquement en incrémentant les valeurs.

Et la chose que je vous vois définir UserId comme la key primaire de la table qui est erronée Order OoderID devrait être la key primaire de la colonne.

Définissez UserID IsIdentify sur false et OrderID IsEdentitfy sur yes et en fait la colonne de key primaire.

Fait intéressant, j'ai trouvé que lorsque j'ai créé une table en utilisant un "Sélectionner … Dans [nouvelle table] à partir de [tables contenant des données]" je ne pouvais pas insert de nouveaux loggings, en mettant le message Insert_Identity sur off. J'ai contourné ceci en supprimant la table puis en utilisant un script Create Table pour le rebuild et maintenant je n'ai aucun problème à insert autant de nouveaux ID que nécessaire