加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – EF6 CodeFirst My [Key] Id列不会自动递增,因为标识列应该

发布时间:2020-12-15 03:42:22 所属栏目:百科 来源:网络整理
导读:我有几个类,我需要从一个持有Id的普通基类派生.暂时忽略其中的一个,让我们说: public class MyBase { [Key] public int Id { get; set; } }public class MyName : MyBase { public string Name { get; set; }} 我的上下文(DataContext)如下所示: public Db
我有几个类,我需要从一个持有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");
                });
}

结果DB,当我启用迁移,添加迁移初始和更新数据库是我没有名为MyBase的表,而是我得到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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读