Entity Framework Core 2.1- Data en la migración – Seed Data

Data Seeding se refiere a la idea de insertar data predefinida en nuestras tablas. En ocasiones utilizamos esto con tablas cuya data no varía mucho, o para tablas que tienen datos de configuración. Un ejemplo típico sería tener una tabla de países, y utilizar Data Seeding para llenar dicha tabla con todos los países del planeta. Algo nuevo en EF Core 2.1, es la idea de poder asociar esta data predefinida a una migración en específico. Esto quiere decir que en una migración podemos indicar que queremos insertar data en una o más tablas. Además de eso, podemos remover esa misma data en otra migración.

El Data Seeding lo hacemos en el método OnModelCreating de nuestro Data Context. Vamos a ver un ejemplo en el cual insertamos un registro en una tabla.

Nota: En este post voy a trabajar con Visual Studio 15.7 preview 5, .net core 2.1 preview 2, y EF Core 2.1 preview 2.

Supongamos que tenemos el siguiente modelo:


public class Student
{
  public int Id { get; set; }
  public string Name { get; set; }
  public DateTime Birthdate { get; set; }
  public bool IsDeleted { get; set; }
}

Agregando Data

Para utilizar Data Seeding, podemos colocar el siguiente código en el método OnModelCreating de nuestro Data Context:


var student1 = new Student() { Id = 7, Name = "Robert Seed", Birthdate = new DateTime(1990, 4, 12), IsDeleted = false };

modelBuilder.Entity<Student>().HasData(student1);

Si te fijas, lo que hacemos es instanciar un nuevo estudiante, y luego utilizamos la función HasData para poder indicarle al EF Core que queremos insertar dicho registro en una migración. El método HasData también es capaz de recibir un listado de objetos en caso de que desees crear varios registros. Fíjate que debemos especificar el Id del registro que vamos a insertar. De no hacerlo, nos da un error.

Si haces un Add-Migration en el Package Manager Console, o con el dotnet CLI, tendremos la siguiente migración creada:


protected override void Up(MigrationBuilder migrationBuilder)

{
  migrationBuilder.InsertData(
  table: "Students",
  columns: new[] { "Id", "Birthdate", "IsDeleted", "Name" },
  values: new object[] { 7, new DateTime(1990, 4, 12, 0, 0, 0, 0,
  DateTimeKind.Unspecified), false, "Robert Seed" });
}

Básicamente lo que tenemos es un InsertData que lo que hace es insertar la data del registro que indicamos en el OnModelCreating. Si hacemos un Update-Database, entonces este registro se insertará en la base de datos.

Este tipo de técnicas son en especial útiles con bases de datos en las cuales tenemos tablas que sirven de configuración o que tienen data relativamente estática.

Borrando Data

Además de agregar data, podemos borrar data que hayamos insertado vía el HasData. Lo único que tenemos que hacer es remover dicho objeto del OnModelCreating y listo. Vamos a ver esto. Remueve el código del método OnModelCreating que insertamos hace poco. Ahora, haz un Add-Migration. Esto nos dará como resultado el siguiente método Up en nuestra migración:


protected override void Up(MigrationBuilder migrationBuilder)
{
  migrationBuilder.DeleteData(
  table: "Students",
  keyColumn: "Id",
  keyValue: 7);
}

Fíjate que lo que hace es hacer un DeleteData, para borrar el registro de la tabla Students con Id igual a 7.

Conclusión

Una nueva funcionalidad de Entity Framework Core 2.1 es poder tener data en nuestras migraciones. Para eso podemos utilizar el método HasData en el ModelBuilder de nuestro método OnModelCreating del Data Context.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s