Não é possível inserir um valor explícito para a coluna de identidade na tabela ‘table’ quando IDENTITY_INSERT está definido como OFF

Eu tenho o erro abaixo quando executo o script a seguir. Qual é o erro e como isso pode ser resolvido?

Insert table(OperationID,OpDescription,FilterID) values (20,'Hierachy Update',1) 

Erro:

Servidor: Mensagem 544, nível 16, estado 1, linha 1

Não é possível inserir um valor explícito para a coluna de identidade na tabela ‘table’ quando IDENTITY_INSERT está definido como OFF.

Você está inserindo valores para OperationId que é uma coluna de identidade.

Você pode ativar a inserção de identidade na tabela dessa maneira para poder especificar seus próprios valores de identidade.

 SET IDENTITY_INSERT Table1 ON INSERT INTO Table1 /*Note the column list is REQUIRED here, not optional*/ (OperationID, OpDescription, FilterID) VALUES (20, 'Hierachy Update', 1) SET IDENTITY_INSERT Table1 OFF 

Não coloque valor no OperationID porque ele será gerado automaticamente. tente isto:

 Insert table(OpDescription,FilterID) values ('Hierachy Update',1) 

Tenha muito cuidado ao configurar IDENTITY_INSERT como ON. Essa é uma prática ruim, a menos que o database esteja no modo de manutenção e definido como usuário único. Isso afeta não apenas sua inserção, mas também a de qualquer outra pessoa que tente acessar a tabela.

Por que você está tentando colocar um valor em um campo de identidade?

Simplesmente se você receber este erro no servidor SQL, execute este

 SET IDENTITY_INSERT tableName ON 

Por exemplo, se o nome da tabela for aluno, a consulta será semelhante a esta: SET IDENTITY_INSERT student ON

Se você está recebendo este erro em seu aplicativo da web ou usando a estrutura de entidades, execute primeiro essa consulta no servidor SQL e Atualize seu modelo de entidade ( .edmx file ) e construa seu projeto e esse erro será resolvido

Na sua entidade para essa tabela, inclua o atributo DatabaseGenerated acima da coluna para a qual a inserção de identidade está configurada:

Exemplo:

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int TaskId { get; set; } 

Se você estiver usando o liquibase para atualizar seu SQL Server, você provavelmente está tentando inserir uma chave de registro em um campo autoIncrement. Removendo a coluna da inserção, seu script deve ser executado.

           ...   

Há o OperationId pré-mencionado em sua consulta, que não deveria estar lá, pois é auto-aprimorada

 Insert table(OperationID,OpDescription,FilterID) values (20,'Hierachy Update',1) 

então sua consulta será

 Insert table(OpDescription,FilterID) values ('Hierachy Update',1) 

Você pode simplesmente usar esta declaração, por exemplo, se o nome da sua tabela for School . Antes da inserção, certifique-se de que identity_insert esteja definido como ON e, após inserir a consulta, vire identity_insert OFF

 SET IDENTITY_INSERT School ON /* insert query enter code here */ SET IDENTITY_INSERT School OFF 

Bem, eu resolvi o meu muito fácil, Verifique se a sua chave primária é o mesmo nome com suas classs, onde a única diferença é que sua chave primária tem ‘ID’ anexado a ela ou especifique [Chave] em chaves primárias que não estão relacionadas a como class é nomeada.

Existem basicamente duas maneiras diferentes de INSERIR registros sem ter um erro:

1) Quando o IDENTITY_INSERT está definido como OFF. A PRIMÁRIA CHAVE “ID” não deve estar presente

2) Quando o IDENTITY_INSERT está ativado. A CHAVE PRIMÁRIA “ID” DEVE ESTAR PRESENTE

Conforme o exemplo a seguir da mesma tabela criada com uma chave PRENARY IDENTITY:

 CREATE TABLE [dbo].[Persons] ( ID INT IDENTITY(1,1) PRIMARY KEY, LastName VARCHAR(40) NOT NULL, FirstName VARCHAR(40) ); 

1) No primeiro exemplo, você pode inserir novos registros na tabela sem receber um erro quando o IDENTITY_INSERT está OFF. A “ID” PRIMARY KEY NÃO DEVE ESTAR PRESENTE nas Declarações “INSERT INTO” e um valor de ID exclusivo será adicionado automaticamente:. Se o ID estiver presente no INSERT neste caso, você receberá o erro “Não é possível inserir o valor explícito para identificar a coluna na tabela …”

 SET IDENTITY_INSERT [dbo].[Persons] OFF; INSERT INTO [dbo].[Persons] (FirstName,LastName) VALUES ('JANE','DOE'); INSERT INTO Persons (FirstName,LastName) VALUES ('JOE','BROWN'); 

RESULTADO DA TABELA [dbo]. [Pessoas] será:

 ID LastName FirstName 1 DOE Jane 2 BROWN JOE 

2) No segundo exemplo, você pode inserir novos registros na tabela sem receber um erro quando o IDENTITY_INSERT está ativado. A PRIMARY KEY “ID” DEVE ESTAR PRESENTE das Instruções “INSERT INTO” , desde que o valor do ID ainda não exista : Se o ID NÃO estiver presente no INSERT, neste caso, você receberá o erro “O valor explícito deve ser especificado para a tabela de colunas de identidade … ”

 SET IDENTITY_INSERT [dbo].[Persons] ON; INSERT INTO [dbo].[Persons] (ID,FirstName,LastName) VALUES (5,'JOHN','WHITE'); INSERT INTO [dbo].[Persons] (ID,FirstName,LastName) VALUES (3,'JACK','BLACK'); 

RESULTADO DA TABELA [dbo]. [Pessoas] será:

 ID LastName FirstName 1 DOE Jane 2 BROWN JOE 3 BLACK JACK 5 WHITE JOHN 

E se você estiver usando o Oracle SQL Developer para se conectar, lembre-se de adicionar / sqldev: stmt /

/ sqldev: stmt / set identity_insert TABELA ativada;

Não sei qual é o uso da “Tabela de Inserção”, mas se você está apenas tentando inserir alguns valores, tente:

 Insert Into [tablename] (OpDescription,FilterID) values ('Hierachy Update',1); 

Eu recebi a mesma mensagem de erro, mas acho que isso deve funcionar. O código deve ser incrementado automaticamente, desde que seja uma chave primária.

O problema levantado de usar DBContext não tipificado ou DBSet se você estiver usando a interface e implementar o método de savechanges de maneira genérica

Se este é o seu caso, proponho fortemente tipado DBContex por exemplo

 MyDBContext.MyEntity.Add(mynewObject) 

então .Savechanges funcionará