c# - net - Código de Entity Framework 6 First int El valor de la columna de identidad es cero para la primera fila
entity framework tutorial español (1)
Su clase de migración concreta debe verse como "algo" como el siguiente:
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
}
Después de la primera ejecución del comando update-database para rellenar la base de datos con datos de inicialización:
Se encontró que todas las columnas int Id comenzaron con cero (0) en lugar del esperado (1).
Se agregaron las siguientes 2 líneas de código para cada entidad / tabla a la parte superior del método Seed en Configuration.cs:
[Nota: debido a las restricciones de clave externa, eliminé todas las filas en las tablas de descendientes, y luego me abrí paso por la cadena ancestral.]
context.Database.ExecuteSqlCommand("delete from Widgets");
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT (''Widgets'', RESEED, 0)");
Luego, volví a actualizar la base de datos, y todas las columnas ID int comenzaron con uno (1).
Si elimino la base de datos, ejecuto / agrego la migración inicial y luego ejecuto update-database, todas las columnas int Id comienzan con cero (0).
Es como si las DBCC CHECKIDENT (''Widgets'', RESEED, 0)
no se ejecutaran la primera vez que se ejecuta el método Seed.
Además, si no hay datos iniciales para una entidad / tabla, no importa cuántas veces se ejecute el comando update-database, la primera vez que se agrega una fila a la tabla vacía, Id será cero (0).
Posiblemente, ¿hay alguna manera de especificar el valor de inicialización para las columnas de identidad int en el método de OnModelCreating
de IdentityModels.cs
?
Actualizar:
DBCC CHECKIDENT (''Table'', RESEED, 0)
:DBCC CHECKIDENT (''Table'', RESEED, 0)
aDBCC CHECKIDENT (''Table'', RESEED, 1)
en Configuration.cs.Eliminado la base de datos.
Ejecutado:
update-database -TargetMigration Initial
(El resultado es todo int Ides begin with 1.)Ejecución
update-database
para restablecer la base de datos. (El resultado es que todos los int Ids comienzan con 2, sin importar cuántas veces ejecute laupdate-database
).