实体框架6代码第一个int第一行的标识列值为零

时间:2015-10-11 18:20:40

标签: c# sql-server ef-code-first entity-framework-6

首次执行update-database命令以使用种子数据填充数据库:

发现所有int Id列都以零(0)而不是预期的(1)开始。

在Configuration.cs的Seed方法顶部为每个实体/表添加了以下两行代码:

[注意:由于外键约束,我删除了后代表中的所有行,然后沿着祖先链的方向前进。]

context.Database.ExecuteSqlCommand("delete from Widgets");
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('Widgets', RESEED, 0)");

然后,我重新使用update-database,并且所有int Id列都以一(1)开头。

如果我删除数据库,运行/添加初始迁移然后运行update-database,则所有int Id列都以零(0)开头。

就好像第一次运行Seed方法时没有执行DBCC CHECKIDENT ('Widgets', RESEED, 0) SQL语句。

此外,如果实体/表没有种子数据,则运行update-database命令的次数无关紧要,第一次将行添加到空表时,Id将为零( 0)。

可能有办法在OnModelCreating的覆盖IdentityModels.cs方法中为int标识列指定初始种子值吗?

更新

  1. 在Configuration.cs中将DBCC CHECKIDENT ('Table', RESEED, 0)更改为DBCC CHECKIDENT ('Table', RESEED, 1)

  2. 删除了数据库。

  3. 已执行:update-database -TargetMigration Initial(结果是所有int ID从1开始。)

  4. 执行update-database以重置数据库。 (无论您运行update-database多少次,结果都是int Ids从2开始。)

1 个答案:

答案 0 :(得分:0)

您的具体迁移课程应该看起来像#34;"如下:

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
}