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

Ste*_*e L 12 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; }
}
Run Code Online (Sandbox Code Playgroud)

我的上下文(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");
                });
}
Run Code Online (Sandbox Code Playgroud)

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

   dbo.MyNames
   -----------
   Id (PK, int, not null)
   Name (nvarchar(max), null)
Run Code Online (Sandbox Code Playgroud)

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

   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();
   }
Run Code Online (Sandbox Code Playgroud)

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

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

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

TYY*_*TYY 24

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Run Code Online (Sandbox Code Playgroud)

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

   modelBuilder.Entity<MyBase>()
        .Property(c => c.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,我必须为一个模型类而不是其他模型类.我恨你EntityFramework. (2认同)