第一行标识列的值为零

本文关键字:标识 一行 | 更新日期: 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.csOnModelCreating方法int Identity列的初始种子值?

更新:

  1. Configuration.cs.

  2. DBCC CHECKIDENT ('Table', RESEED, 0)更改为DBCC CHECKIDENT ('Table', RESEED, 1)
  3. 删除数据库

  4. execute: update-database -TargetMigration Initial (Result is all int id以1开头)

  5. 执行update-database重置数据库。(结果是所有int id都以2开头,无论你运行update-database多少次。)

第一行标识列的值为零

您的具体迁移类应该看起来像下面这样:

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
}