views:

3070

answers:

5

Hi, 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.

+1  A: 

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>
Yacoder
+1  A: 

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 :)

Pär Björklund
A: 

if you have a bindingsource bound, you should call the suspendbinding:

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

thank you so mush.

i encountered the same problem but the following procedure fixed it completely

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

regards.

Mohamed - Libya
A: 

Hi all

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

Mohamed - Libya
Note: System.Data.Objects.SaveOptions.None is only available in .Net 4.0.
sfuqua