En este post vamos a ver cómo tratar el enfoque code first en Entity framework core. Para aquellos de ustedes que no estén familiarizados con Entity Framework, se trata de un marco de trabajo de Microsoft que facilita la creación de aplicaciones de bases de datos como vimos en uno de los posts anteriores.
Índice
1 - Qué es Code first en Entity Framework Core?
El enfoque code first en Entity Framework core significa que se diseñan y se programan las clases de nuestro modelo de datos en código, y luego Entity Framework Core crea la base de datos, o las tablas correspondientes a partir de dichas clases.
Para este post, vamos a ver la misma estructura que vimos en el post anterior sobre database first. Además, no olvides que todo el código está disponible en GitHub.
2 - Implementar code First con entity framework Core
Lo primero que tenemos que hacer es crear una clase para cada tabla de nuestra base de datos.
En este caso creamos las dos entidades que necesitamos:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
}
public class Wokringexperience
{
public int Id { get; set; }
public int UserId { get; set; }
[MaxLength(50)]
public string Name { get; set; }
public string Details { get; set; }
public string Environment { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}
Como puedes ver puedes incluir anotaciones en las propiedades, en este caso un límite en la base de datos de 50 caracteres en la columna name.
Ahora, antes de continuar instalamos Microsoft.EntityFrameworkCore.Design
y el paquete de mysql porque mi base de datos es MySQL, si tienes SqlServer o una diferente, este segundo paquete es diferente.
A continuación creamos la clase que hereda de DbContext
y que define la instancia de la base de datos, así como las tablas que contiene.
public class CursoEfContext : DbContext
{
public virtual DbSet<User> Users { get; set; }
public virtual DbSet<Wokringexperience> Wokringexperiences { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseMySQL("server=127.0.0.1;port=4306;database=cursoEF;user=root;password=cursoEFpass");
}
Como puedes ver, en el DbContext hemos configurado tanto las tablas como la conexión a la base de datos, aunque esa parte, se puede hacer en el startup, pero por simplicidad la dejamos aquí.
Una vez tenemos todo configurado, pasamos a crear la base de datos. Tenemos varias opciones, pero a mi me gusta que se ejecute todo al ejecutar el programa. Lo que quiere decir que si la base de datos no existe, se creará.
using (var scope = app.Services.CreateScope())
{
CursoEfContext context = scope.ServiceProvider.GetRequiredService<CursoEfContext>();
context.Database.EnsureCreated();
}
Y este es el resultado de ejecutar el código:
Como podemos ver, la columna name
tiene el varchar
con el límite en 50 caracteres, como hemos especificado con las anotaciones.
EnsureCreated
está diseñado para montar la base de datos de una forma muy rápida, por ejemplo cuando estás creando la primera implementación de un proyecto. Por ahora lo vamos a dejar así, pero cuando veamos migraciones, cambiaremos el código un poco.
Lo que hacemos con EnsureCreated
es asegurarnos que la base de datos existe y tiene tablas, si no tiene tablas se ejecuta con el modelo de entity framework que tienes definido, pero si tiene tablas, aunque no sean las mismas que tienes en el modelo, nada se ejecutará.
- NOTA: Puedes ahorrarte esta configuración si quieres ejecutar la configuración inicial o las migraciones en la línea de comandos.
Vamos a dejar este post aquí y en el siguiente veremos migraciones (migrations en inglés), que es la forma más común de implementar code first en .NET, pero he querido hacer este post de una forma separada para que se entienda el concepto de lo que es code first.
Conclusión
Con Code First vamos a crear primero el modelo de datos en el código y luego Entity Framework crea la base de datos, las tablas y relaciones automáticamente.
Code first es muy popular debido a que es relativamente sencillo de mantener, especialmente en microservicios, es bastante fácil de usar y completo para diseñar bases de datos.