首次执行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标识列指定初始种子值吗?
更新
在Configuration.cs中将DBCC CHECKIDENT ('Table', RESEED, 0)
更改为DBCC CHECKIDENT ('Table', RESEED, 1)
。
删除了数据库。
已执行:update-database -TargetMigration Initial
(结果是所有int ID从1开始。)
执行update-database
以重置数据库。 (无论您运行update-database
多少次,结果都是int Ids从2开始。)
答案 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
}