En .NET Core, Entity Framework Core ofrece dos enfoques principales para manejar la base de datos: Code First y Database First. Aunque se suelen utilizar de forma separada, es posible combinarlos en un solo proyecto para aprovechar lo mejor de ambos mundos. En este blog, te mostraré cómo implementar ambos enfoques, utilizando paquetes NuGet instalados tanto desde la consola como mediante dotnet add package.
¿Qué es Code First?
Code First implica comenzar con la creación de las clases de tu modelo en código y luego usar las migraciones para generar la base de datos. Este enfoque es ideal cuando quieres tener control total sobre la estructura de la base de datos desde el código.
Pasos para implementar Code First:
-
Instalación de los paquetes NuGet necesarios:
Puedes instalar los paquetes mediante la consola de NuGet o utilizando
dotnet add packageA través de la consola de NuGet en Visual Studio:
Abre la Consola del Administrador de Paquetes desde Visual Studio (Tools > NuGet Package Manager > Package Manager Console) y ejecuta los siguientes comandos:
Install-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFrameworkCore.ToolsO alternativamente, usando
dotnet add package:dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Tools -
Crear las entidades del modelo:
Define las clases de modelo que representarán las tablas en tu base de datos. Por ejemplo:
public class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime DatePublished { get; set; } } -
Crear el
DbContext:Define el contexto de la base de datos para manejar las operaciones con las entidades.
public class BlogDbContext : DbContext { public BlogDbContext(DbContextOptions<BlogDbContext> options) : base(options) { } public DbSet<Post> Posts { get; set; } } - Configurar la conexión a la base de datos: En
appsettings.json, define la cadena de conexión para tu base de datos.{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=BlogDb;Trusted_Connection=True;" } } -
Configurar el
DbContextenProgram.cs:En .NET 6, la configuración del
DbContexty los servicios de la aplicación se hacen directamente enProgram.cs. Aquí te muestro cómo configurar tuDbContextpara trabajar con SQL Server:using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using YourNamespace.Data; // Asegúrate de cambiar YourNamespace a tu espacio de nombres var builder = WebApplication.CreateBuilder(args); // Agregar el servicio DbContext y configurarlo para utilizar SQL Server builder.Services.AddDbContext<BlogDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // Agregar controladores y otros servicios si es necesario builder.Services.AddControllersWithViews(); var app = builder.Build(); // Configuración de la aplicación if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run(); -
Generar los modelos desde la base de datos:
Una vez instalados los paquetes, puedes generar las clases de modelo y el
DbContextbasados en tu base de datos existente. Si has configurado tu cadena de conexión correctamente, puedes referenciarla utilizando el prefijoName=en lugar de pegar la cadena completa. Esto se hace ejecutando el comandoscaffold:Consola de NuGet:
Scaffold-DbContext "Name=ConnectionStrings:DefaultConnection" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context BlogDbContextDespués de ejecutar el comando, Entity Framework Core generará los modelos y el contexto basándose en la base de datos existente. Los archivos generados estarán en la carpeta
Modelso la que hayas especificado en el comando.Consideraciones importantes
- Este método (
Name=ConnectionStrings:YourConnectionName) solo funcionará si tu proyecto está configurado adecuadamente y las herramientas deEntity Framework Corepueden acceder a la configuración. Asegúrate de que el archivoappsettings.jsonesté correctamente estructurado y que elDbContextesté registrado enProgram.cs. - Requisitos de compilación: antes de ejecutar el scaffolding, tu proyecto debe ser compilable. Si tienes errores en el código o la configuración no es válida, el scaffolding fallará.
- Este método (
¿Cómo combinar Code First y Database First?
Combinar Code First y Database First te permite trabajar con una base de datos existente mientras realizas modificaciones controladas a través de migraciones.
-
Genera los modelos desde la base de datos con Database First: Utiliza el comando
Scaffold-DbContextpara generar los modelos a partir de tu base de datos. -
Realiza modificaciones utilizando Code First: Después de haber generado las clases, puedes hacer cambios a las entidades y usar migraciones para reflejarlos en la base de datos.
Por ejemplo, supongamos que agregas una nueva entidad
Comment:public class Comment { public int Id { get; set; } public string Author { get; set; } public string Text { get; set; } public int PostId { get; set; } public Post Post { get; set; } } -
Genera una nueva migración para reflejar los cambios en la base de datos:
Consola de NuGet:
Add-Migration AddCommentEntity Update-DatabaseO usando
dotnet ef:dotnet ef migrations add AddCommentEntity dotnet ef database update
¡Perfecto! Incluir la instalación de los paquetes a través de Install-Package es una excelente idea, ya que algunos usuarios prefieren usar la consola de NuGet en lugar de dotnet add package. Voy a actualizar la guía para incluir ambos métodos y proporcionar una explicación detallada.
Título: Combinando Code First y Database First en .NET Core: Guía Completa
Introducción
En .NET Core, Entity Framework Core ofrece dos enfoques principales para manejar la base de datos: Code First y Database First. Aunque se suelen utilizar de forma separada, es posible combinarlos en un solo proyecto para aprovechar lo mejor de ambos mundos. En este blog, te mostraré cómo implementar ambos enfoques, utilizando paquetes NuGet instalados tanto desde la consola como mediante dotnet add package.
¿Qué es Code First?
Code First es un enfoque en el que se crean primero las clases de modelo en el código, y luego se usa Entity Framework Core para generar la base de datos a partir de ellas.
Pasos para implementar Code First:
-
Instalación de los paquetes NuGet necesarios:
Puedes instalar los paquetes mediante la consola de NuGet o utilizando
dotnet add package.A través de la consola de NuGet en Visual Studio:
Abre la Consola del Administrador de Paquetes desde Visual Studio (Tools > NuGet Package Manager > Package Manager Console) y ejecuta los siguientes comandos:
powershellCopiar códigoInstall-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFrameworkCore.ToolsO alternativamente, usando
dotnet add package:bashCopiar códigodotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Tools -
Crear las entidades del modelo:
Define las clases de modelo que representarán las tablas en tu base de datos. Por ejemplo:
csharpCopiar códigopublic class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime DatePublished { get; set; } } -
Crear el
DbContext:Define el contexto de la base de datos para manejar las operaciones con las entidades.
csharpCopiar códigopublic class BlogDbContext : DbContext { public BlogDbContext(DbContextOptions<BlogDbContext> options) : base(options) { } public DbSet<Post> Posts { get; set; } } -
Configurar la cadena de conexión:
En
appsettings.json, configura la conexión con la base de datos.jsonCopiar código{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=BlogDb;Trusted_Connection=True;" } } -
Agregar la configuración en
Startup.cs:Registra el contexto de la base de datos en el contenedor de dependencias.
csharpCopiar códigopublic void ConfigureServices(IServiceCollection services) { services.AddDbContext<BlogDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); } -
Crear migraciones y actualizar la base de datos:
Una vez que las entidades estén definidas, puedes crear una migración para generar la base de datos. Ejecuta estos comandos en la Consola del Administrador de Paquetes o en la terminal:
Consola NuGet:
powershellCopiar códigoAdd-Migration InitialCreate Update-DatabaseTerminal
dotnet:bashCopiar códigodotnet ef migrations add InitialCreate dotnet ef database update
¿Qué es Database First?
Database First es útil cuando ya tienes una base de datos existente y deseas generar las clases de tu aplicación basándote en esa base de datos. Esto es particularmente útil para proyectos que comienzan con una base de datos ya definida.
Pasos para implementar Database First:
-
Instalación de los paquetes NuGet necesarios:
Nuevamente, puedes utilizar la consola de NuGet o
dotnet add package.Consola de NuGet:
powershellCopiar códigoInstall-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFrameworkCore.DesignO usando
dotnet add package:bashCopiar códigodotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design -
Generar los modelos desde la base de datos:
Una vez instalados los paquetes, puedes generar las clases de modelo y el
DbContextbasados en tu base de datos existente. Esto se hace ejecutando el comandoscaffold:Consola de NuGet:
powershellCopiar códigoScaffold-DbContext "Server=.;Database=BlogDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir ModelsO usando
dotnet efen la terminal:bashCopiar códigodotnet ef dbcontext scaffold "Server=.;Database=BlogDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o ModelsEsto creará las clases de modelo y el contexto dentro de la carpeta
Models.
¿Cómo combinar Code First y Database First?
Combinar Code First y Database First te permite trabajar con una base de datos existente mientras realizas modificaciones controladas a través de migraciones.
-
Genera los modelos desde la base de datos con Database First: Utiliza el comando
Scaffold-DbContextpara generar los modelos a partir de tu base de datos. -
Realiza modificaciones utilizando Code First: Después de haber generado las clases, puedes hacer cambios a las entidades y usar migraciones para reflejarlos en la base de datos.
Por ejemplo, supongamos que agregas una nueva entidad
Comment:csharpCopiar códigopublic class Comment { public int Id { get; set; } public string Author { get; set; } public string Text { get; set; } public int PostId { get; set; } public Post Post { get; set; } } -
Genera una nueva migración para reflejar los cambios en la base de datos:
Consola de NuGet:
powershellCopiar códigoAdd-Migration AddCommentEntity Update-DatabaseO usando
dotnet ef:bashCopiar códigodotnet ef migrations add AddCommentEntity dotnet ef database update
Ventajas y Desventajas de Code First y Database First
Ventajas de Code First:
- Total control sobre la estructura de la base de datos desde el código.
- Uso de migraciones para control de versiones y cambios en la base de datos.
Ventajas de Database First:
- Facilita el trabajo cuando ya tienes una base de datos existente.
- Generación automática de los modelos y el contexto a partir de la base de datos.
Desventajas:
- Code First puede ser más complicado si tienes una base de datos en producción que requiere cambios frecuentes.
- Database First puede volverse menos flexible si necesitas realizar cambios en las entidades generadas.
Conclusión
Combinar Code First y Database First en un solo proyecto de .NET Core te permite empezar con una base de datos existente y, al mismo tiempo, mantener la flexibilidad para realizar cambios controlados a través de migraciones. Este enfoque es especialmente útil en proyectos que evolucionan constantemente y requieren cambios en la base de datos de manera controlada.