Jaison
Jaison

Reputation:

Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF

I have the below error when I execute the following script. What is the error about, and how it can be resolved?

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

Error:

Server: Msg 544, Level 16, State 1, Line 1

Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF.

Upvotes: 550

Views: 1426812

Answers (30)

chris c
chris c

Reputation: 331

I encountered this issue upgrading from nopcommerce outdated version. In the old version this was never an issue, but upgrading to 4.7.0 it was.

My solution was to just rename the identity column to Id Then when specifying the schema, I just inherit the base entity which has Id available.

public class Operations : BaseEntity
{
    //OPERATION ID NOW NOT NEEDED
    /// <summary>
    /// Gets or sets the base identifier
    /// </summary>
    //public int OperationId { get; set; }


    /// <summary>
    /// Gets or sets the customer email
    /// </summary>
    [Column("CustomerEmail")]
    public string CustomerEmail { get; set; }
}

Upvotes: 0

Supercoder
Supercoder

Reputation: 1204

There are basically 2 different ways to INSERT a record that contain a Primary Key without having an error:

  1. When the IDENTITY_INSERT is set OFF. The PRIMARY KEY "ID" MUST NOT BE PRESENT

  2. When the IDENTITY_INSERT is set ON. The PRIMARY KEY "ID" MUST BE PRESENT

As per the following example from the same Table created with an IDENTITY PRIMARY KEY:

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);
  1. In the first example, you can insert new records into the table without getting an error when the IDENTITY_INSERT is OFF. The PRIMARY KEY "ID" MUST NOT BE PRESENT from the "INSERT INTO" Statements and a unique ID value will be added automatically:. If the ID is present from the INSERT in this case, you will get the error "Cannot insert explicit value for identify column in table..."

SET IDENTITY_INSERT [dbo].[Persons] OFF;

INSERT INTO [dbo].[Persons] (FirstName,LastName) VALUE ('JANE','DOE');

INSERT INTO Persons (FirstName,LastName) VALUES ('JOE','BROWN');

OUTPUT of TABLE [dbo].[Persons] will be:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
  1. In the Second example, you can insert new records into the table without getting an error when the IDENTITY_INSERT is ON. The PRIMARY KEY "ID" MUST BE PRESENT from the "INSERT INTO" Statements as long as the ID value does not already exist: If the ID is NOT present from the INSERT in this case, you will get the error "Explicit value must be specified for identity column table..."

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');

OUTPUT of TABLE [dbo].[Persons] will be:

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

Upvotes: 31

Dan Leksell
Dan Leksell

Reputation: 540

I ran into this issue upgrading from Microsoft.EntityFrameworkCore.SqlServer 3.1.5 to 6.0.26. I had a query to find a DB object which was then being associated to another DB object. The initial query had .AsNoTracking() so EF was trying to add a new entity. Seemed to work okay with Microsoft.EntityFrameworkCore.SqlServer 3.1.5 but when I upgraded to 6.0.26 I was getting the error "Cannot insert explicit value for identity column in table 'TableName' when IDENTITY_INSERT is set to OFF."

Upvotes: 0

Alok Kumar Sahoo
Alok Kumar Sahoo

Reputation: 551

Please try this one =>

   [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
        public int dl_no { get;set; }

Upvotes: 2

Saeid
Saeid

Reputation: 658

You can not insert data in OperationID column when you set identity increment for this field.

enter image description here

Do not enter a value in this field, it will be set automatically.

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

Upvotes: 2

PeterPazmandi
PeterPazmandi

Reputation: 581

In my case the problem was, that I specified the autoincrement ID by myself from the code when I tried to update the records. After removing the ID property from new record creation, then everything worked fine.

Upvotes: 2

Okechukwu Ezekiel
Okechukwu Ezekiel

Reputation: 101

First thing first...

You need to know why you are getting the error in the first place.

Lets take a simple HttpPost of JSON Data that looks like this:

{
"conversationID": 1, 
"senderUserID": 1, 
"receiverUserID": 2,
"message": "I fell for the wrong man!",
"created":"2022-02-14T21:18:11.186Z"
}

If you generated your database using Entity framework core while connecting to SQLServer or any other database server, the database automatically takes the responsibility of updating and auto-generating the Key/Unique identifier of the Identity Column, which in most cases is an integer value it auto-increments.

To safely post your data using the in-built conventions which keeps you at a safer end, just remove the ID field from the data you want to send to the database, and let the database engine and ef-core do the heavy lifting which they are designed to do.

So the proper way to post the data would be:

{ 
    "senderUserID": 1, 
    "receiverUserID": 2,
    "message": "I fell for the wrong man!",
    "created":"2022-02-14T21:18:11.186Z"
    }

You would notice I took out the ConversationID.

You can learn more about entity framework on this website : https://entityframeworkcore.com

I hope you stick more to conventions than configuration in your apps. Knowing how to do things with already proven standards and conventions will save you a lot of working hours.

Upvotes: 1

codearmalik
codearmalik

Reputation: 25

Put break point on your [HttpPost] method and check what value is being passed to Id property. If it is other than zero then this error will occur.

Upvotes: 1

Prashant Agarwal
Prashant Agarwal

Reputation: 819

Even if everything was correct, this error can appear if the data type of Identity column is not int or long. I had identity column as decimal, although I was only saving int values (my bad). Changing data type in both database and underlying model fixed the issue for me.

Upvotes: 1

Hoque MD Zahidul
Hoque MD Zahidul

Reputation: 11989

  1. First Go to the required table name

Step 2 -> right click on the table name

step 3 --> Select Design

step 4 --> Click on the column name

step 5) go to the column properties then Set No to the Identity Specification

[Note: After insert to the explicit value if you want you can revert back to identity specification true then again it will generate the value]

if you using SQL server management studio you can use below method

Step 1) enter image description here step 2) enter image description here

Upvotes: 3

David Charles
David Charles

Reputation: 557

EF Core 3.x

Referencing Leniel Maccaferri, I had a table with an Autoincrementing attribute called ID(original primary key) and another attribute called Other_ID(The new primary Key). Originally ID was the primary key but then Other_ID needed to be the new Primary key. Since ID was being used in other parts of the application I could not just remove it from Table. Leniel Maccaferri solution only worked for me after I added the following snippet:

        entity.HasKey(x => x.Other_ID);
        entity.Property(x => x.ID).ValueGeneratedOnAdd();

Full Code snippet Below (ApplicationDbContext.cs):

  protected override void OnModelCreating(ModelBuilder builder)
  {
        builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
        base.OnModelCreating(builder);
        builder.Entity<tablename>(entity =>
        {
            entity.HasKey(x => x.Other_ID);
            entity.Property(x => x.ID).ValueGeneratedOnAdd();
            entity.HasAlternateKey(x => new { x.Other_ID, x.ID });                
        });
        
    }

Upvotes: 2

Andras
Andras

Reputation: 96

Had the same issue using Entity Framework with a model like this (I simplified the original code):

public class Pipeline
{
  public Pipeline()
  {
     Runs = new HashSet<Run>();
  }

  public int Id {get; set;}
  public ICollection<Run> Runs {get;set;}
}

public class Run
{
  public int Id {get; set;}
  public int RequestId {get; set;}
  public Pipeline Pipeline {get;set;}
}

The Run has a many-to-1 relation to the Pipeline (one Pipeline can run multiple times)

In my RunService I have injected the DbContex as context. The DbContext had a Runs DbSet. I implemented this method in the RunService:

public async Task<Run> CreateAndInit(int requestId, int pplId)
{
  Pipeline pipeline = await pipelineService.Get(pplId).FirstOrDefaultAsync().ConfigureAwait(false);
  Run newRun = new Run {RequestId = requestId, Pipeline = pipeline};
  context.Runs.Add(newRun);
  await context.SaveChangesAsync().ConfigureAwait(false); // got exception in this line
  return newRun;
}

As the method executed, I got this exception:

Exception has occurred: CLR/Microsoft.EntityFrameworkCore.DbUpdateException
Exception thrown: 'Microsoft.EntityFrameworkCore.DbUpdateException' in System.Private.CoreLib.dll: 'An error occurred while updating the entries. See the inner exception for details.'
 Inner exceptions found, see $exception in variables window for more details.
 Innermost exception     Microsoft.Data.SqlClient.SqlException : Cannot insert explicit value for identity column in table 'Pipelines' when IDENTITY_INSERT is set to OFF.

For me, the solution was to separate the creation of the object and relation

public async Task<Run> CreateAndInit(int requestId, int pplId)
{
  Pipeline pipeline = await pipelineService.Get(pplId).FirstOrDefaultAsync().ConfigureAwait(false);
  Run newRun = new Run {RequestId = requestId};
  context.Runs.Add(newRun);
  newRun.Pipeline = pipeline; // set the relation separately
  await context.SaveChangesAsync().ConfigureAwait(false); // no exception
  return newRun;
}

Upvotes: 0

BerkGarip
BerkGarip

Reputation: 544

im using asp.net core 5.0 and i get that error. i get that error because i was adding another data and triggering the other .SaveChanges() method like below :

 _unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
 int request = HttpContext.Response.StatusCode;
 if (request == 200)
 {
     int tryCatch = _unitOfWorkCVar.Complete();
     if (tryCatch != 0)
     {
         productVariant.CategoryVariantID = variantValue.CategoryVariantID;
         productVariant.ProductID = variantValue.ProductID;
         productVariant.CreatedDate = DateTime.Now;
         _unitOfWorkProductVariant.RepositoryProductVariant.Create(productVariant);
         _unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
         int request2 = HttpContext.Response.StatusCode;
         if(request==200)
         {
             int tryCatch2=_unitOfWorkProductVariant.Complete();//The point where i get that error
         }///.......

Upvotes: 0

Alfonso Casta&#241;eda
Alfonso Casta&#241;eda

Reputation: 127

everyone comment about SQL, but what happened in EntityFramework? I spent reading the whole post and no one solved EF. So after a few days a found solution: EF Core in the context to create the model there is an instruction like this: modelBuilder.Entity<Cliente>(entity => { entity.Property(e => e.Id).ValueGeneratedNever();

this produces the error too, solution: you have to change by ValueGeneratedOnAdd() and its works!

Upvotes: 11

user3542654
user3542654

Reputation: 343

In my case I was having set another property as key in context for my modelBuilder.

modelBuilder.Entity<MyTable>().HasKey(t => t.OtherProp);

I had to set the proper id

 modelBuilder.Entity<MyTable>().HasKey(t => t.Id);

Upvotes: 2

Umang Patwa
Umang Patwa

Reputation: 2965

Simply If you getting this error on SQL server then run this query-

SET IDENTITY_INSERT tableName ON

This is working only for a single table of database e.g If the table name is student then query look like this:

SET IDENTITY_INSERT student ON

If you getting this error on your web application or you using entity framework then first run this query on SQL server and Update your entity model (.edmx file) and build your project and this error will be resolved

Upvotes: 102

Wasim
Wasim

Reputation: 724

In my CASE I was inserting more character than defined in table.

In My Table column was defined with nvarchar(3) and I was passing more than 3 characters and same ERROR message was coming .

Its not answer but may be in some case problem is similar

Upvotes: 0

cryanbhu
cryanbhu

Reputation: 5264

Note that if you are closing each line with ;, the SET IDENTITY_INSERT mytable ON command will not hold for the following lines.

i.e.
a query like

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

Gives the error
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

But a query like this will work:

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

It seems like the SET IDENTITY_INSERT command only holds for a transaction, and the ; will signify the end of a transaction.

Upvotes: 17

Naresh Bisht
Naresh Bisht

Reputation: 719

I solved this problem by creating a new object every time I want to add anything to the database.

Upvotes: 2

Kate Kasinskaya
Kate Kasinskaya

Reputation: 933

If you're having this issue while using an sql-server with the sequelize-typescript npm make sure to add @AutoIncrement to ID column:

  @PrimaryKey
  @AutoIncrement
  @Column
  id!: number;

Upvotes: 4

Salem Kosemani
Salem Kosemani

Reputation: 101

Another situation is to check that the Primary Key is the same name as with your classes where the only difference is that your primary key has an 'ID' appended to it or to specify [Key] on primary keys that are not related to how the class is named.

Upvotes: 5

Tomasz Dzięcielewski
Tomasz Dzięcielewski

Reputation: 3907

The best solution is to use annotation GeneratedValue(strategy = ...), i.e.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;

it says, that this column is generated by database using IDENTITY strategy and you don't need to take care of - database will do it.

Upvotes: 5

Encrypted Drink
Encrypted Drink

Reputation: 91

Simply delete the tables that are dragged into your .dbml file and re-drag them again. Then Clean solution>Rebuild solution> Build solution.

Thats what worked for me.

I didnt made the table on my own, I was using VS and SSMS, I followed this link for ASP.NET Identity:https://learn.microsoft.com/en-us/aspnet/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project

Upvotes: -1

Siphamandla Ngwenya
Siphamandla Ngwenya

Reputation: 3092

  1. This occurs when you have a (Primary key) column that is not set to Is Identity to true in SQL and you don't pass explicit value thereof during insert. It will take the first row, then you wont be able to insert the second row, the error will pop up. This can be corrected by adding this line of code [DatabaseGenerated(DatabaseGeneratedOption.Identity)] in your PrimaryKey column and make sure its set to a data type int. If the column is the primary key and is set to IsIDentity to true in SQL there is no need for this line of code [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. this also occurs when u have a column that is not the primary key, in SQL that is set to Is Identity to true, and in your EF you did not add this line of code [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Upvotes: 4

user902490
user902490

Reputation: 393

In your entity for that table, add the DatabaseGenerated attribute above the column for which identity insert is set:

Example:

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

Upvotes: 32

user5948411
user5948411

Reputation:

you can simply use This statement for example if your table name is School. Before insertion make sure identity_insert is set to ON and after insert query turn identity_insert OFF

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

Upvotes: 16

Mostafa Basha
Mostafa Basha

Reputation: 45

The problem raised from using non-typed DBContext or DBSet if you using Interface and implement method of savechanges in a generic way

If this is your case I propose to strongly typed DBContex for example

MyDBContext.MyEntity.Add(mynewObject)

then .Savechanges will work

Upvotes: -1

Matthew
Matthew

Reputation: 129

I'm not sure what the use for the "Insert Table" is, but if you're just trying to insert some values try:

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

I had the same error message come up, but I think this should work. The ID should auto-increment automatically as long as it's a primary key.

Upvotes: 0

Onkar_M18
Onkar_M18

Reputation: 3061

There is pre-mentioned OperationId in your query which should not be there as it is auto increamented

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

so your query will be

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

Upvotes: 6

HLGEM
HLGEM

Reputation: 96640

Be very wary of setting IDENTITY_INSERT to ON. This is a poor practice unless the database is in maintenance mode and set to single user. This affects not only your insert, but those of anyone else trying to access the table.

Why are you trying to put a value into an identity field?

Upvotes: 45

Related Questions