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

标签 c# sql entity-framework code-first on-duplicate-key

我有几个类需要从一个包含 Id 的公共(public)基类派生。暂时忽略除其中之一之外的所有内容,假设我们有:

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");
                });
}

生成的数据库,当我启用迁移、初始添加迁移和更新数据库时,我没有得到名为 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 KEY 异常。注意(为了全面披露)我实际上是在我的代码的另一部分创建 jj 和 jh 对象,然后将它们作为 MyBase 对象传递给这个方法(上面),然后将它们转换回 MyName 对象(如果它们是这样的话)。我希望这不是问题。

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

如果您能为这个 EF6 CodeFirst 新手提供任何帮助,我们将不胜感激。谢谢。

最佳答案

我记得以前做 EF 时我会创建一个带有 Identity 的表,在类中我会用

为 id 列添加属性
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

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

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

关于c# - EF6 CodeFirst 我的 [Key] Id 列不会像标识列那样自动递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23147479/

相关文章:

C# 数据集到 Xml,节点重命名

c# - 无法将 NULL 值插入表 'MaintenanceId' 列 '<tableName>' ;列不允许为空。 INSERT 失败 EF 6.1

C# Regex Lazy Quantifier 不匹配预期值

mysql - 从另一个表中的另一列计算列值

sql - 好的开源 SQL 解析器?

sql - 在 sql server 数据库中查找可用空间的最佳方法?

c# - 在模型上使用 DateTime.UtcNow 总是在实体中创建迁移

c# - 不一致的 TitleBar 高度返回

c# - EF Moq 单元测试,不确定验证

c# - 将 EF Core 列/字段指定为只读