EF 1.1 Code First .NET Core Visual Studio 2017 | Parte 1

En esta oportunidad, veremos cómo utilizar Migrations de Entity Framework utilizando el acercamiento Code First en .Net Core con Visual Studio 2017, pero primero ¿Que es Code First?

Code First

Entity Framework nos da la posibilidad de contar con diferentes acercamientos a la hora de realizar nuestras aplicaciones conectadas contra base de datos.

Uno de ellos es el acercamiento Code First, el cual nos permite comenzar escribiendo nuestras clases, es decir nuestro modelo dentro del dominio de la aplicación, sin necesidad de tener o contar con el modelo relacional de base de datos. Esto es realmente beneficioso si es el equipo de desarrollo es quien debe realizar tanto el código de la aplicación como el diseño de base de datos, ya que podemos abstraernos de las sentencias de SQL y generar todas nuestras tablas y relaciones desde nuestras clases escritas en C# por ejemplo.

Migrations

Teniendo en cuenta el acercamiento Code First, estaremos generando y actualizando nuestro modelo a medida que el desarrollo avanza, por lo cual la primera versión de nuestra base de datos va quedando desactualizada conforme pasa el tiempo.

La funcionalidad de Migrations de Entity Framework nos ayuda a poder mantener no solo nuestra base de datos actualizada con el modelo, sino que también contar con la posibilidad rollback y versionado desde el código, lo cual veremos más adelante en esta publicación.

Más información sobre Migrations en EF Core: https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/migrations

How to:

Llegó el momento, veremos la capacidad de Entity Framework Core con Migrations en este pequeño tutorial.

Para esto haremos el siguiente modelo:

  • Movies: Utilizado para representar nuestras películas.
  • Genres: Utilizado para representar los géneros de nuestras películas.

Prerrequisitos

  • Visual Studio 2017 (Community Edition en mi caso)

Primero generamos un proyecto de .NET Core, en este caso un proyecto web:

Para contar con soporte para Entity Framework Core, debemos agregar el paquete NuGet, para ello lo haremos ejecutando la siguiente linea en la consola de administración de paquetes NuGet:

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Para utilizar migrations podemos usar la consola de administración de paquetes o el CLI. En este caso estaremos utilizando el CLI, ya que nos sirve tanto para Visual Studio como para Visual Code, por lo que debemos agregar la dependencia en el archivo .csproj

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
  </ItemGroup>

Creación de nuestro modelo

Generamos una carpeta llamada Models, donde ubicamos las siguientes clases:

namespace CodeFirst.EF.Demo.Models
{
    public class Movie
    {

        public int Id { get; set; }

        public string Title { get; set; }

        public decimal Price { get; set; }

        public virtual Genre Genre { get; set; }
    }
}
namespace CodeFirst.EF.Demo.Models
{
    public class Genre
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }
}

Creación del contexto de base de datos

Generamos una carpeta Data, donde alojaremos la clase MovieDbContext que hereda de DbContext, la cual se encargará de relacionar nuestro modelo contra las entidades de base de datos.

using Microsoft.EntityFrameworkCore;
using CodeFirst.EF.Demo.Models;

namespace CodeFirst.EF.Demo.Data
{
    public class MovieDbContext: DbContext
    {
        public MovieDbContext(DbContextOptions<MovieDbContext> options) : base(options)
        {
        }

        public DbSet<Genre> Genres { get; set; }

        public DbSet<Movie> Movies { get; set; }
    }
}

De acuerdo a Entity Framework, la palabra reservada DbSet une nuestro modelo con una tabla de la base de datos por ejemplo, Movie con una tabla llamada Movies.

Agregar el contexto en StartUp.cs

Debemos registrar en el inyector de dependencias nuestro contexto. No es el foco de esta publicación centrarnos en el inyector de dependencias, solo sepan que existe y que viene por defecto en ASP.Net Core.

        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.

            services.AddDbContext<MovieDbContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddMvc();
        }

Agregar el string de conexión

En .Net Core, a diferencia de .Net Framework donde guardamos el string de conexión en el Web.config, este se encuentra ahora en el archivo appsettings.json:

{

  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MoviesDatabase;Trusted_Connection=True;MultipleActiveResultSets=true";
  },

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning";
    }
  }
}

Para este tutorial, estamos usando localdb, pero podríamos utilizar SQL Server.

Migración Inicial

Desde el CMD de Windows, nos posicionamos en el path del proyecto como se muestra a continuación:

Ejecutamos el comando:

dotnet ef migrations add InitialCreate

Si todo sale bien, vamos a contar en nuestros proyectos con una carpeta llamada Migrations, donde podremos ver las clases InitialCreate y ModelSnapshot. Más información sobre estas clases haciendo click aquí.

Aplicar nuestra migración a la base de datos

Es momento de impactar lo generado hasta el momento desde el código de nuestra aplicación, hacia la base de datos. Para ello ejecutaremos desde el CMD de Windows el siguiente comando, siempre posicionados desde el path de nuestro proyecto:

dotnet ef database update

Si utilizamos el SQL Server Object Explorer, podemos ver que nuestra base de datos fue generada con las tablas, sus columnas, las FK y PK. Si observan por defecto Entity Framework toma la propiedad Id de nuestro modelo como clave primaria.

Conclusión

En esta primer introducción, vimos cómo generar a partir de nuestro modelo, las entidades de base de datos, lo cual puede ser muy beneficioso para los desarrolladores para comenzar proyecto en forma rápida sin tener que diseñar primero el modelo de base de datos.

En la parte 2, estaremos viendo como actualizar nuestra base de datos conforme cambiemos el modelo, como generar restricciones desde el código que se vean reflejadas en la base de datos como por ejemplo definir claves primarias o poner longitudes máximas en los string, entre otras.

Pueden descargar el código de GitHub

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

Create a free website or blog at WordPress.com.

Up ↑

%d bloggers like this: