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:更新条目时发生错误。有关详细信息,请参阅内部异常。---> System.Data.UpdateException:更新条目时发生错误。请参阅详细信息的内部异常。---> System.Data.SqlClient .SqlException:违反主键约束'PK_用户_0CF04B1821B6055D'。无法在对象'dbo.Users'中插入重复键。“

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

谢谢。

编辑:忘了告诉 Member 是一个抽象类,对不起。

4

4 回答 4

3

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

于 2011-03-27T15:46:08.517 回答
1

我刚遇到这个。与标记的答案状态一样,TPC 不会将密钥设置为身份。因此,您可以为其使用注释:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
于 2014-04-17T03:48:00.040 回答
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();
    

您应该在修改之前尝试附加您的实体。

于 2011-03-27T15:12:29.317 回答
0
  • 我也有重复键的问题。对我来说,原因是我错误地使用了

    ID = 新的 Guid()

代替

Id = Guid.NewGuid()

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

于 2016-01-20T10:35:53.890 回答