2010-10-02 12 views
0

Une table SQL possède des propriétés d'incrémentation automatique pour la clé primaire AnnotationID du type INT.Comment insérer une ligne dans la base de données SQL avec IDENTITY_INSERT défini sur OFF à l'aide des services WCF?

L'application Silverlight WCF code de service:

public void InsertImageAnnotation(int imageId, string imagePath) 
    { 
     DataClassDataContext db = new DataClassDataContext(); 
     ImageAnnotation row = new ImageAnnotation(); 

     row.ImageID = imageId;//foreign key 
     row.ImagePath = imagePath; 

     db.ImageAnnotations.InsertOnSubmit(row); 
     db.SubmitChanges();    
    } 

Une exception est levée sur db.SubmitChanges() avec le message: Impossible d'insérer la valeur explicite pour la colonne de identiy dans la table ImageAnnotations lorsque IDENTITY_INSERT est réglé sur OFF.

Je ne spécifie pas la clé primaire, qui est supposée être la clé d'identité, parce que je m'attends à ce que la base de données se charge de l'incrémentation automatique de la valeur de la clé primaire.

Le tableau script de création est ici:

UTILISATION [ImagingSericesDB]

GO

SET ANSI_NULLS SUR

GO

SET quoted_identifier

GO

CREATE TABLE [dbo]. [ImageAnnotations] (

[AnnotationID] [int] IDENTITY(0,1) NOT NULL, 

[ImageID] [int] NOT NULL, 

[ImagePath] [text] NULL, 

CONTRAINTE [PK_ImageAnnotations] PRIMARY KEY CLUSTERED

( [AnnotationID] ASC

) AVEC (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMAIRE]

) SUR [PRIMAIRE] T EXTIMAGE_ON [PRINCIPAL]

GO

ALTER TABLE [dbo]. [ImageAnnotations] AVEC ajouter CONTRAINTE [FK_ImageAnnotations_Images] FOREIGN KEY ([ImageID]) RÉFÉRENCES [dbo]. [Images] ([AIImageID]) GO

ALTER TABLE [dbo]. [ImageAnnotations] CONTRAINTE CHÈQUE [FK_ImageAnnotations_Images]

Ce que je suis absent dans ma syntaxe d'appel de service? Comment puis-je spécifier ou exécuter IDENTITY_INSERT sur ON dans mon code de service ci-dessus? Quelle est la syntaxe? Merci beaucoup, Val

+1

Vous devriez probablement poster votre script de création de table. – nlawalker

Répondre

0

Vous envoyez une valeur pour le champ d'identité quand il veut le créer automatiquement. C'est ce que le message d'erreur signifie. Vérifiez pour voir quel code vous générez pour voir quel est le problème. Il est également tout à fait possible que le problème ne soit pas dans votre insert mais dans un insert à partir d'un trigger, vérifiez donc aussi.

En aucun cas vous ne devez activer l'insertion d'identité. Soit vous envoyez une valeur d'identité que vous n'avez pas besoin d'envoyer, soit vous ne devriez pas utiliser une identité pour générer l'identifiant. L'insertion d'identité n'est généralement utilisée que par dbas pour insérer des données héritées avant la mise en ligne d'une base de données.Il devrait très rarement être utilisé à un autre moment et jamais par quelqu'un qui doit demander la syntaxe. C'est une commande qui peut royalement bousiller votre base de données, ne l'utilisez pas.

+0

OK, j'ai vérifié deux fois et le seul champ identity = true est la clé primaire (AnnotationID) que je n'envoie pas. J'envoie le reste des champs évalués avec mon service. Peut-être que je dois envoyer le champ de clé primaire avec null de toute façon? – val

+1

Eh bien, on dirait que je l'ai réparé. Merci beaucoup HLGEM de ne pas m'avoir suggéré de me mêler d'identités :-) J'étais proche de ça. Le problème résidait dans l'erreur de conception de la base de données: le nom de la clé étrangère a été mal orthographié et la vérification de la clé étrangère a échoué. Attribution d'un nom à la clé (ImageID à AIImageID) a corrigé les appels de service. Bravo et bon week-end. – val