Paquete | Descripción |
---|---|
Microsoft.EntityFrameworkCore | EF Core |
Microsoft.EntityFrameworkCore.Design | Contiene toda la lógica de design-time para EF Core. Contiene clases que nos servirán para indicarle a EF Tools por ejemplo como crear un contexto. |
Microsoft.EntityFrameworkCore.SqlServer | Es el provider para la bd Microsoft SQL Server |
Microsoft.EntityFrameworkCore.Tools | Este paquete permite la ejecución de comandos de entity framework (dotnet ef). Este permite hacer más fácil realizar varias tareas de EF Core, como: migraciones, scaffolding, etc |
Microsoft.EntityFrameworkCore.InMemory | (Opcional) Es un provider para bd en Memoria, es sobretodo útil para testing. |
namespace Homeworks.DataAccess
{
public class HomeworksContext : DbContext
{
public DbSet<Homework> Homeworks {get; set;}
public DbSet<Exercise> Exercises {get; set;}
public HomeworksContext(DbContextOptions options) : base(options) { }
}
}
Primero que crearemos la clase ContextFactory. Esta tiene la responsabilidad de crear instancias del db context en memoria que las vamos a utilizar en estas primeras clases del curso de ejemplo y nos resultara util a la hora de realizar tests. Para crear la base de datos en MSSQL utilizaremos un pequeño atajo hasta que demos WebApi
using Microsoft.EntityFrameworkCore;
namespace Homeworks.DataAccess
{
public class ContextFactory
{
public static HomeworksContext GetMemoryContext(string nameBd) { //BD EN MEMORIA
var builder = new DbContextOptionsBuilder<HomeworksContext>();
return new HomeworksContext(GetMemoryConfig(builder, nameBd));
}
private static DbContextOptions GetMemoryConfig(DbContextOptionsBuilder builder, string nameBd) {
builder.UseInMemoryDatabase(nameBd);
return builder.Options;
}
}
}
Primero nos dirigiremos a nuestro proyecto WebApi y en la clase Startup
buscamos el método ConfigureServices
en este le agregamos la siguiente linea:
//Cambiar el ConnectionString por el que vayan a utilizar.
services.AddDbContext<DbContext, HomeworksContext>(o => o.UseSqlServer(@"Server=.\SQLEXPRESS;Database=HomeworksDB;Trusted_Connection=True;MultipleActiveResultSets=True;"));
Quedando de la siguiente manera:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddDbContext<DbContext, HomeworksContext>(o => o.UseSqlServer(@"Server=.\SQLEXPRESS;Database=HomeworksDB;Trusted_Connection=True;MultipleActiveResultSets=True"));
}
Si no hacemos esto lo que sucede es que nos va a saltar un error a la hora de hacer o crear una migración diciendo oque no sabe como crear nuestro contexto ya que le falta en este caso el connection string, entonces nosotros a traves de la web api le indicamos como. Por estas clases lo vamos a dejar asi esto obviamente esta mal ya que hardcodeamos nuestro connection string, cuando se de WebApi volveremos a esta linea y la arreglaremos. :)
EF Core no cuenta con migraciones automáticas. Si usamos una base de datos relacional SQL (!InMemory) entonces debemos crear las migraciones. Hay varias formas de hacer esto, pararnos sobre el proyecto del Contexto y referencia al de arranque con los .json de configuración. O lo inverso.
Antes que nada tenemos que estar seguro de tenes instalado el paquete "Microsoft.EntityFrameworkCore.Tools" en nuestro DataAccess para esto nos dirigiremos a este y
cd Homeworks.DataAccess
dotnet add package Microsoft.EntityFrameworkCore.Tools
Desde la raíz del proyecto:
cd Homeworks.DataAccess
dotnet ef migrations add MyMigration --startup-project="..\Homeworks.WebApi\"
Output: Si vamos al proyecto DataAccess nos debió haber generado una carpeta llamada Migrations con la migración.
Después de crear la migración es necesario ejecutarla para eso utilizaremos el siguiente comando:
dotnet ef database update --startup-project="..\Homeworks.WebApi\"
Las migraciones son la manera de mantener el schema de la BD sincronizado con el Dominio, por esto cada vez que se modifica el dominio se deberá crear una migración.
Commando | Descripción |
---|---|
dotnet ef migrations add NOMBRE_DE_LA_MIGRATION | Este comando creará la migración. Crea 3 archivos .cs 1) : Contiene las operaciones Up() y Down() que se aplicaran a la BD para remover o añadir objetos. 2) .Designer: Contiene la metadata que va a ser usada por EF Core. 3) ModelSnapshot: Contiene un snapshot del modelo actual. Que será usada para determinar qué cambio cuando se realice la siguiente migración. |
dotnet ef database update | Este comando crea la BD en base al context, las clases del dominio y el snapshot de la migración. |
dotnet ef migrations remove | Este comando remueve la ultima migración y revierte el snapshot a la migración anterior. Esto solo puede ocurrir si la migración no fue aplicada todavía. |
dotnet ef database update NOMBRE_DE_LA_MIGRATION | Este commando lleva la BD al migración del nombre NOMBRE_DE_LA_MIGRATION. |
Es conveniente para testing usar el provider InMemory, este nos permite tener una base de datos en memoria. Permitiéndonos no impactar en la BD real. Para este en particular simplemente se requiere en el builder del context usar builder.UseInMemoryDatabase y simplemente pasarle como parámetro un string con el nombre de la bd. Ver FactoryContext más arriba.