Solución:
El problema que está experimentando no es específico de las guías generadas automáticamente. Lo mismo ocurre con alguna valores clave autogenerados, incluidas las columnas de incremento automático (identidad) de uso común.
Es causado por una semilla de datos específica (HasData
) requisito:
Este tipo de datos semilla se administra mediante migraciones y el script para actualizar los datos que ya están en la base de datos debe generarse sin conectarse a la base de datos. Esto impone algunas restricciones:
- El valor de la clave principal debe especificarse incluso si normalmente lo genera la base de datos. Se utilizará para detectar cambios de datos entre migraciones.
- Los datos sembrados previamente se eliminarán si la clave principal se cambia de alguna manera.
Tenga en cuenta la primera viñeta. Entonces, mientras que para CRUD normal, su PK se generará automáticamente, está requerido para especificarlo al usar HasData
API fluida, y el valor debe ser constante (no cambia), por lo que no puede usar Guid.NewGuid()
. Por lo tanto, debe generar varios Guids, tomar su representación de cadena y usar algo como esto:
mb.Entity<User>().HasData(
new User() { Id = new Guid("pre generated value 1"), ... },
new User() { Id = new Guid("pre generated value 2"), ... },
new User() { Id = new Guid("pre generated value 3"), ... }
);
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
en el campo GUID funciona en Entity Framework 6.x, ¡puede que aún no esté en EF Core!
Entonces la solución es:
1) Primero escribe tu BaseModel
clase de la siguiente manera:
public class BaseModel
{
[Key]
public Guid Id { get; set; }
public DateTime CreatedOn { get; set; } = DateTime.UtcNow;
public DateTime? UpdatedOn { get; set; }
public DateTime LastAccessed { get; set; }
}
2) Entonces OnModelCreating()
método en tu DbContext
debe ser como sigue:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<YourEntity>().Property(x => x.Id).HasDefaultValueSql("NEWID()");
modelBuilder.Entity<User>().HasData(
new User() { Id = Guid.NewGuid(), Email = "[email protected]", Name = "Mubeen", Password = "123123" },
new User() { Id = Guid.NewGuid(), Email = "[email protected]", Name = "Tahir", Password = "321321" },
new User() { Id = Guid.NewGuid(), Email = "[email protected]", Name = "Cheema", Password = "123321" }
);
}
Ahora cree una nueva migración y actualice la base de datos en consecuencia. ¡Espero que se resuelva su problema!
Puedes usar defaultValueSql: "newid()"
en su archivo de migración de Code First.
Por ejemplo;
public override void Up()
{
CreateTable(
"dbo.ExampleTable",
c => new
{
Id = c.Guid(nullable: false, identity: true, defaultValueSql: "newid()"),
RowGuid = c.Guid(nullable: false, defaultValueSql: "newid()"),
})
.PrimaryKey(t => t.Id);
}