Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

InvalidOperationException when calling SaveChanges in .NET Entity framework

I'm trying to learn how to use the Entity framework but I've hit an issue I can't solve. What I'm doing is that I'm walking through a list of Movies that I have and inserts each one into a simple database.

This is the code I'm using

private void AddMovies(DirectoryInfo dir)
{
    MovieEntities db = new MovieEntities();
    foreach (DirectoryInfo d in dir.GetDirectories())
    {
        Movie m = new Movie { Name = d.Name, Path = dir.FullName };
        db.AddToMovies(movie);
    }
    db.SaveChanges();
}

When I do this I get an exception at db.SaveChanges() that read.

The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges.

I haven't been able to find out what's causing this issue. My database table contains three columns
Id int autoincrement
Name nchar(255)
Path nchar(255)

Update: I Checked my edmx file and the SSDL section have the StoreGeneratedPattern="Identity" as suggested. I also followed the blog post and tried to add ClientAutoGenerated="true" and StoreGenerated="true" in the CSDL as suggested there. This resulted in compile errors ( Error 5: The 'ClientAutoGenerated' attribute is not allowed.). Since the blog post is from 2006 and it has a link to a follow up post I assume it's been changed.

However, I cannot read the followup post since it seems to require an msdn account.

like image 756
Paxxi Avatar asked Jun 17 '09 17:06

Paxxi


3 Answers

I found the solution to this.

What happened was that when I created my table I forgot to add the primary key and set (Is Identity) property to yes. I then created my Entity model and got this error.

I went back and fixed my database table but I still hade the weird Exception. What solved the problem in the end was to remove the entity and re-create it after the table was fixed.

No more exceptions :)

like image 123
Paxxi Avatar answered Oct 16 '22 04:10

Paxxi


last time I tried the following code and I said it is working fine

bs.SuspendBinding();
Data.SaveChanges();
bs.ResumeBinding();

The important things which I wana tell you today are that:

1- if we use the above code to suspend binding we have to do more code to fix a lot of scenarios like index lost in the collections and the master detail bindings

2- if we use the following code instead of the above code we will see the exception gone and every thing will be ok where no need to write more code

        Data.SaveChanges(System.Data.Objects.SaveOptions.None);

I hope this solves your similar problems

thank you friends

like image 43
Mohamed A. Alrshah Avatar answered Oct 16 '22 04:10

Mohamed A. Alrshah


This exception seems to tell you that you have equal values in severals rows in the Id column, which is supposed to only have unique values, because it's a key column. Entity Framework can handle such columns in two ways: either you (the Client) generates unique values, or the Server generates unique values. In your case it seems logical to allow the Server to generate autoincremented keys.

Do you have the StoreGeneratedPattern key set for the Id column in your SSDL file?

Here is an example from this blogpost:

<EntityType Name="rooms" Key="id">
    <Property Name="id" Type="int" Nullable="false" 
              StoreGeneratedPattern="Identity" />
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" />
</EntityType>
like image 6
Max Galkin Avatar answered Oct 16 '22 05:10

Max Galkin