Entity Framework Code First - Cannot insert duplicate key in object 'db'
I'm using the new EF code first to one project of mine, and i'm getting a weird error, my mode is:
abstract class Member
{
public virtual int MemberId;
... some other stuff
}
class User : Member
{
public virtual string Name;
... some more props no new key defined
}
class MyDbContext
{
public DbSet<User> Users {get;set;}
}
The result of the deployment to SQL Server is just ok, i've a Members Table and a Users Table (TPC). Now in my main i've the following code:
static Main()
{
User x,y;
using(MyDbContext ctx = new MyDbContext())
{
x = ctx.Users.Create();
y = ctx.Users.Create();
x.Name = "SomeUser";
y.Name = "SomeUser2";
ctx.SaveChanges();
}
}
On save changes i get:
"Unhandled Exception: System.Data.Entity.Infrastructure.DbUpdateException: An error occurr开发者_开发技巧ed while updating the entries. See the inner exception for de tails. ---> System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient .SqlException: Violation of PRIMARY KEY constraint 'PK_Users_0CF04B1821B6055D'. Cannot insert duplicate key in object 'dbo.Users'."
The MemberId by default is identity so i just not seeing what's going on here. i've tried to create the instances with new and Attach them to the context but the error was the same, any ideas? The database is empty!
Thanks.
EDIT: Forgot to told that Member is an abstract class sorry bout that.
I just tested it and tables of derived types in TPC (table per concrete type) inheritance don't have PK defined as identity in EF 4.1 RC.
- Is MemberId autoIncremented?
- Have you checked the id of your created users (with console.Writeline for exemple)?
Does it work if you do the following:
x = ctx.Users.Create(); x.Name = "SomeUser"; ctx.SaveChanges(); y = ctx.Users.Create(); y.Name = "SomeUser2"; ctx.SaveChanges();
You should try to attach your entity before you modify it.
I just came across this. Like the marked answer states, TPC doesn't set the key to an identity. So you can use an annotation for it:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
I also had an issue with duplicate keys. For me the reason was that I mistakenly used
Id = new Guid()
instead of
Id = Guid.NewGuid()
in a factory method for initializing my database.
- This related stackoverflow question might also give some further hints: Cannot insert duplicate key in object 'dbo.User'.\r\nThe statement has been terminated
精彩评论