C# EF6 CodeFirst我的[Key]Id列不会像标识列那样自动递增

C# EF6 CodeFirst我的[Key]Id列不会像标识列那样自动递增,c#,sql,entity-framework,code-first,on-duplicate-key,C#,Sql,Entity Framework,Code First,On Duplicate Key,我有几个类需要从持有Id的公共基类派生。暂时忽略其中一个以外的所有类,假设我们有: public class MyBase { [Key] public int Id { get; set; } } public class MyName : MyBase { public string Name { get; set; } } 我的上下文(DataContext)如下所示: public DbSet<MyName>MyNames { get; set; }

我有几个类需要从持有Id的公共基类派生。暂时忽略其中一个以外的所有类,假设我们有:

public class MyBase {
   [Key]
   public int Id { get; set; } 
}
public class MyName : MyBase {
   public string Name { get; set; }
}
我的上下文(DataContext)如下所示:

public DbSet<MyName>MyNames { 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<MyBase>()
            .Property(c => c.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

   modelBuilder.Entity<MyName>()
            .Map(m => {
                    m.MapInheritedProperties();
                    m.ToTable("MyNames");
                });
}
到目前为止,所有这些都是编译和构建的,然后我使用以下方法对其进行测试:

   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得到一个重复的密钥异常。注意(为了完全公开),我实际上是在代码的另一部分中创建jj和jh对象,然后将它们作为MyBase对象传递到这个方法(如上),然后将它们转换回MyName对象(如果它们是MyName对象的话)。我希望这不是问题

我想如果所有内容都在一个表中,Id可以标记为Identity,并且@Identity可以用来指定对象Id值。也许我最终需要创建一个MyBases表,并首先创建该记录,然后将Id复制到事务中的派生表中。最好的方法是什么


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

我记得当我使用EF时,我会创建一个带有Identity的表,并在类中为id列添加属性

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
所以我假设你的代码应该是

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

我认为问题在于您使用的是EF6代码优先迁移。执行此操作时,需要使用.AddOrUpdate()方法为数据库种子。涵盖它。

您可以发布生成的模式/DDL吗?这达到了创建MyBase表的预期效果。您现在使用什么?奇怪的是,我必须为一个模型类而不是其他模型类执行此操作。我恨你。啊啊啊啊啊。。。继承使这成为EF 6.1.3的一个要求,在我尝试按照继承之前,它会自动工作。我讨厌你
   modelBuilder.Entity<MyBase>()
        .Property(c => c.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);