EF6 CodeFirst我的 Id列不会像标识列那样自动递增

我有几个类需要从一个包含Id的公共基类派生。 暂时忽略除了其中一个之外的其他所有内容,让我们说:

public class MyBase { [Key] public int Id { get; set; } } public class MyName : MyBase { public string Name { get; set; } } 

我的上下文(DataContext)看起来像这样:

 public DbSetMyNames { get; set; } // to avoid having EF make a MyBases table and instead map // MyBase.Id into MyNames and my other derived classes I do this ... protected override void OnModelCreating((DbModelBuilder modelBuilder) { modelBuilder.Entity() .Property(c => c.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); modelBuilder.Entity() .Map(m => { m.MapInheritedProperties(); m.ToTable("MyNames"); }); } 

当我启用迁移,添加迁移初始化和更新数据库时,生成的数据库是我没有名为MyBases的表,而是在MyNames中获取Id列

  dbo.MyNames ----------- Id (PK, int, not null) Name (nvarchar(max), null) 

到目前为止一切都很好,所有这些编译和构建,然后我使用类似下面的内容测试它:

  using ( DataContext dc = new DataContext()) { var jj = new MyName { Name = "Janice Joplin" }; dc.MyNames.Add(jj); dc.SaveChanges(); var jh = new MyName { Name = "Jimmy Hendrix" }; dc.MyNames.Add(jh); dc.SaveChanges(); } 

这是第一次(Janice添加Id = 0)而不是第二次… Jimmy获得DUPLICATE KEYexception。 注意(完全公开)我实际上是在我的代码的另一部分中创建jj和jh对象,然后将它们作为MyBase对象传递给此方法(上面),然后将它们转换回MyName对象(如果它们就是这样)。 我希望这不是问题。

我想如果一切都在一个表中,则Id可以标记为Identity,并且@@ IDENTITY可以用于分配对象Id值。 也许我毕竟需要创建一个MyBases表,然后首先创建该记录,然后将Id复制到事务中的派生表中。 对此最好的方法是什么?

任何帮助这个EF6 CodeFirst新手将不胜感激。 谢谢。

我记得当我以前做EF时我会创建一个带有Identity的表,在类中我会将id列赋予

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

所以我假设你的代码应该是

  modelBuilder.Entity() .Property(c => c.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

我相信问题在于您正在使用EF6 Code First Migrations。 当您这样做时,您需要使用.AddOrUpdate()方法为您的数据库设定种子。 这个Stack Overflow问题涵盖了它。