我首先使用新的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创建实例并将它们附加到上下文但错误是相同的,任何想法? 数据库是空的!
感谢。
编辑:忘了告诉那个成员是一个抽象的对不起来。答案 0 :(得分:3)
我刚刚对它进行了测试,并且TPC (每个具体类型的表)继承中的派生类型表没有在EF 4.1 RC中将PK定义为标识。
答案 1 :(得分:1)
如果您执行以下操作,是否有效:
x = ctx.Users.Create();
x.Name = "SomeUser";
ctx.SaveChanges();
y = ctx.Users.Create();
y.Name = "SomeUser2";
ctx.SaveChanges();
您应该在修改实体之前尝试附加您的实体。
答案 2 :(得分:1)
我刚刚遇到过这个。与标记的答案状态一样,TPC不会将密钥设置为标识。所以你可以使用它的注释:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
答案 3 :(得分:0)
我也遇到了重复密钥的问题。对我来说,原因是我错误地使用了
Id = new Guid()
而不是
listeDevices.push_back((char*) pcDevName);
在初始化数据库的工厂方法中。