第一行标识列的值为零
本文关键字:标识 一行 | 更新日期: 2023-09-27 18:17:21
第一次执行update-database命令用种子数据填充数据库后:
发现所有int Id列的开头都是0(0),而不是预期的1(1)。
在Configuration.cs中的Seed方法的顶部为每个实体/表添加以下2行代码:
[注意:由于外键的约束,我删除了子表中的所有行,然后沿着祖先链向上工作。]
context.Database.ExecuteSqlCommand("delete from Widgets");
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('Widgets', RESEED, 0)");
然后,我重新运行update-database,所有的int Id列都以1(1)开头。
如果我删除数据库,运行/添加初始迁移,然后运行update-database,所有的int Id列都以0(0)开始。
这就好像DBCC CHECKIDENT ('Widgets', RESEED, 0)
SQL语句在第一次运行Seed方法时没有被执行。
同样,如果一个实体/表没有种子数据,不管运行多少次update-database命令,第一次将一行添加到空表中,Id将为零(0)。
可能,是否有一种方法来指定在覆盖IdentityModels.cs
的OnModelCreating
方法int Identity列的初始种子值?
更新:
Configuration.cs.
将删除数据库
execute:
update-database -TargetMigration Initial
(Result is all int id以1开头)执行
update-database
重置数据库。(结果是所有int id都以2开头,无论你运行update-database
多少次。)
DBCC CHECKIDENT ('Table', RESEED, 0)
更改为DBCC CHECKIDENT ('Table', RESEED, 1)
您的具体迁移类应该看起来像下面这样:
public class 201707132034165_MyAwesomeDbInitial : DbMigration
{
#region <Methods>
public override void Up()
{
CreateTable(
"dbo.HasOverdrive",
c => new
{
HasOverdriveId = c.Int(nullable: false, identity: true),
HasOverdriveValue = c.String(nullable: false, maxLength: 5)
})
.PrimaryKey(t => t.HasOverdriveId)
.Index(t => t.HasOverdriveValue, unique: true, name: "UX_HasOverdrive_AlternateKey");
}
// This should is called by your DbConfiguration class
public void Seed(MyAwesomeDbContext context)
{
// DO THIS FIRST !!!!!!!!!!!!!!!
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('HasOverdrive', RESEED, 0)");
// LOOKUPS
SeedHasOverdrive(context);
}
private void SeedHasOverdrive(MeasurementContractsDbContext context)
{
context.HasOverdrive.AddOrUpdate
(
m => m.Id,
new HasOverdrive { HasOverdriveId = 0, HasOverdriveValue = "No" }, // 0 = FALSE
new HasOverdrive { HasOverdriveId = 1, HasOverdriveValue = "Yes" } // 1 = TRUE
);
}
#endregion
}