60
votes

I'm getting this error on EF.

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

The column on the Db is identity increment and on the EF design file, StoreGeneratedPattern is identity as well. Seems like EF is trying to insert 0 every time I try to save.

Some suggestions says ID is reserved on tables or drop the table and rerun the scripts.

Any ideas?

Here's some code:

GroupMember groupMember = new GroupMember();
            groupMember.GroupId = group.Id;
            groupMember.UserId = (new UserId(group.Owner));
            //groupMember.Id = _groupContext.GroupMembers.Count();
            group.GroupMembers.Add(groupMember);

            _groupContext.SaveChanges();

database

EF Designer

10

10 Answers

74
votes

I have run into this before. This error means you are trying to assign a value explicitly to a column where the database automatically assigns it.

Suggestion: Update your edmx file to reflect any changes you may have made in the database. If the database automatically assigns the value, you should see the "IsDbGenerated=true" attribute in your designer file under that property. If it's not there, you can add it manually.

41
votes

Try this:

using System.ComponentModel.DataAnnotations.Schema;
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public decimal Identity_Col { get; set; }

The Entity Framework class file adds these lines of code to the Identity column.

19
votes

Put these attribs on top of the property which is identity:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
8
votes

First match in google, so here is my solution:

EF Code first: Because of an auto-increment PK 'id' field AND a guid column, design like this:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid FileToken { get; set; }

there was a duplicate identity. I changed it to:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("newid()")]
public Guid FileToken { get; set; }

and the problem went away.

Hope it helps you.

Erik

4
votes

In EF 6, there is a property of the field/column in your model for doing this: StoreGeneratedPattern.

Set this to "Identity" in the property dropdown list.

(I don't know about EF 4. The above answer, using IsDbGenerated, seems to be for EF 4.)

And this corresponds in the underlying XML to an attribute to the element:

<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />

--but you don't need to deal with the XML manually, since you can use the designer.

How this gets messed up isn't clear. I had the problem even after refreshing my model from the database. Perhaps it gets confused if you set the PK on the table, or change its name, after you have already generated the model. (I am using the table/database-first approach, not code first.)

You can't use the above approach of putting the C# attribute on the entity code, because in this situation the entity code is generated by EF. EF is supposed to understand ("by itself") that the field is an identity.

4
votes

I encountered the same problem and error message in my AspNetCore 2.x application. The only way I could solve it was by removing this line in the ModelBuilder.Entity method of the DbContext class:

// remove: entity.Property(e => e.Id).ValueGeneratedNever();
2
votes

I had this issue in my app; and got fixed it changing the property "StoredGeneratedPattern" of the id field to Identity.

So, Go to the model; look up for the table; click on propierties of the primary key fiel; and change the property.

1
votes

See intercepting Entity Insert for generated always columns like StartTime and EndTime columns on history tables, rowversion columns as well.

1
votes

I solved this by removing primary key in model from inserting data. because primary key auto increment.

var book = new Book
   {
   //   Id = 1,  //Don't need to write this
        Genre = "Technology",
        Author = "Charles Petzold",
        Title = "Programming Windows 5th Edition",
        Price = 30,
        Publisher = "Microsoft Press"
    };

  _unitOfWork.Books.Add(book);
       
0
votes

Well, You need give a value to ID, for example for the object Auto, just you should VarAuto.Id = 0;

After that you could do it something like this =>

using( MyContext db = new MyContext()){

db.Autos.Add(VarAuto);
db.SaveChanges();
}

That is the solution just give value to id, EF could be recognize the identity value in the table.

Just Try.