实体框架代码优先 - 无法在对象'db'中插入重复键

时间:2011-03-27 14:08:03

标签: c# entity-framework ef-code-first entity-framework-4.1

我首先使用新的EF代码到我的一个项目,我得到一个奇怪的错误,我的模式是:

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;}
}

部署到SQL Server的结果还可以,我有一个成员表和一个用户表(TPC)。 现在我的主要内容是以下代码:

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

   }
}

保存更改后,我得到:

  

“未处理的例外情况:   System.Data.Entity.Infrastructure.DbUpdateException:   更新时发生错误   条目。查看内部异常   细节。 ---&GT;   System.Data.UpdateException:错误   更新条目时发生。   有关详细信息,请参阅内部异常   ---&GT; System.Data.SqlClient .SqlException:违反PRIMARY   关键约束   'PK_ 用户 _0CF04B1821B6055D'。不能   在对象中插入重复键   'dbo.Users'“。

默认情况下,MemberId是身份,所以我只是没有看到这里发生了什么。我试图用new创建实例并将它们附加到上下文但错误是相同的,任何想法? 数据库是空的!

感谢。

编辑:忘了告诉那个成员是一个抽象的对不起来。

4 个答案:

答案 0 :(得分:3)

我刚刚对它进行了测试,并且TPC (每个具体类型的表)继承中的派生类型表没有在EF 4.1 RC中将PK定义为标识。

答案 1 :(得分:1)

  1. MemberId是否自动增加?
  2. 您是否检查过您创建的用户的ID(例如,使用console.Writeline)?
  3. 如果您执行以下操作,是否有效:

    x = ctx.Users.Create();        
    x.Name = "SomeUser";        
    ctx.SaveChanges();        
    y = ctx.Users.Create();        
    y.Name = "SomeUser2";        
    ctx.SaveChanges();
    
  4. 您应该在修改实体之前尝试附加您的实体。

答案 2 :(得分:1)

我刚刚遇到过这个。与标记的答案状态一样,TPC不会将密钥设置为标识。所以你可以使用它的注释:

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

答案 3 :(得分:0)

  • 我也遇到了重复密钥的问题。对我来说,原因是我错误地使用了

    Id = new Guid()

而不是

listeDevices.push_back((char*) pcDevName);

在初始化数据库的工厂方法中。