Primeros pasos con Entity Framework Core

Modelar, consultar y guardar datos

Modelo

Con EF Core, el acceso a los datos se realiza mediante un modelo. Un modelo se compone de clases de entidad y un contexto derivado que representa una sesión con la base de datos, lo que le permite consultar y guardar datos.

Puede generar un modelo a partir de una base de datos existente, codificar manualmente un modelo para que coincida con su base de datos o usar Migraciones de EF para crear una base de datos a partir de su modelo (y evolucionarlo a medida que su modelo cambia con el tiempo).

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace Intro
{
    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}

Consultando

Las instancias de sus clases de entidad se recuperan de la base de datos mediante Language Integrated Query (LINQ).

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}

Guardar datos

Los datos se crean, eliminan y modifican en la base de datos utilizando instancias de sus clases de entidad.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}

Eliminación de datos

Las instancias de sus clases de entidad se recuperan de la base de datos mediante Language Integrated Query (LINQ).

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Attach(blog);
    db.Blogs.Remove(blog);
    db.SaveChanges();
}

Actualización de datos

Los datos se actualizan en la base de datos utilizando instancias de sus clases de entidad.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    var entity = db.Blogs.Find(blog);
    entity.Url = "http://sample2.com";
    db.SaveChanges();
}

Base de datos primero en Entity Framework Core con una biblioteca de clases y SQL Server

De acuerdo, me tomó alrededor de un día resolverlo, así que aquí estoy publicando los pasos que seguí para que mi Base de datos primero funcione en un ‘Proyecto de clase (.NET Core)’, con una aplicación web .NET Core.

Paso 1 - Instalar .NET Core

Asegúrese de estar usando .NET Core, no DNX (Sugerencia: debería poder ver la opción .NET Core al crear un nuevo proyecto) - Si NO lo descarga desde aquí

Si tiene problemas para instalar .NET Core (el error es algo así como que Visual Studio 2015 Update 3 no se instaló correctamente), puede ejecutar la instalación con el comando: [DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1] – Lo que evitará que la instalación realice la comprobación de Visual Studio problema de Github

ingrese la descripción de la imagen aquí

Paso 2 - Crea los proyectos

Cree una nueva aplicación web ASP.NET Core -> Luego seleccione la aplicación web en la siguiente pantalla

ingrese la descripción de la imagen aquí

Agregue un proyecto Biblioteca de clases (.NET Core)

ingrese la descripción de la imagen aquí

Paso 3 - Instalación de paquetes EF

Abra su archivo project.json de Class Library y pegue lo siguiente, luego guarde el archivo:

{
  "version": "1.0.0-*",

  "dependencies": {
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "NETStandard.Library": "1.6.0"
  },
  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "net46": {
    },
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0-*"
        }
      }
    }
  }
}

Esto debería restaurar los paquetes en Referencias

ingrese la descripción de la imagen aquí

—————- O

Puede instalarlos usando el Administrador de paquetes Nuget ejecutando los siguientes comandos en la Consola del Administrador de paquetes

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

Nota: instale un paquete a la vez; si obtiene un error después de la instalación

Microsoft.EntityFrameworkCore.Tools

Luego cambie el contenido de su sección de frameworks project.json a esto:

  "frameworks": {
    "net46": {
    },
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0-*"
        }
      }
    }
  }

Paso 4 - Creación del modelo de base de datos

Ahora, para generar la base de datos, ejecute el siguiente comando en la Consola del administrador de paquetes (NO olvide cambiar la cadena de conexión a su base de datos)

Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer

Esto le dará el error sobre el proyecto de inicio:

ingrese la descripción de la imagen aquí

Para esto, debe agregar las mismas referencias que agregó a Class Library a la aplicación web .NET

Así que abra su project.json para la aplicación web,

En dependencias, agregue:

"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",

y en herramientas añadir:

"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",

Después de realizar los cambios Guarde el archivo.

Así es como se ve mi proyecto.json

ingrese la descripción de la imagen aquí

Luego, vuelva a ejecutar el comando en la Consola del administrador de paquetes contra la biblioteca de clases:

Si aún no ha agregado la referencia de su biblioteca de clases a la aplicación web, obtendrá este error:

ingrese la descripción de la imagen aquí

para resolver esto, agregue la referencia de su biblioteca de clases a su aplicación web:

ingrese la descripción de la imagen aquí

Finalmente

Vuelva a ejecutar el comando en la Consola del administrador de paquetes:

Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

Esto debería crear las Entidades en la Carpeta de Modelos, en la biblioteca de clases.

ingrese la descripción de la imagen aquí

Pasar una cadena de conexión

En mi caso aquí, tenemos una aplicación multiusuario, en la que cada cliente tiene su propia base de datos, p. Cliente_1, Cliente_2, Cliente_3. Así que la cadena de conexión tenía que ser dinámica.

Así que agregamos una propiedad de cadena de conexión a un constructor y la pasamos al Contexto en el método OnConfiguring

public partial class ClientContext
{
    private readonly string _connectionString;

    public ClientContext(string connectionString) : base()
    {
        _connectionString = connectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_connectionString);
    }
}

y lo usé así:

    public void TestConnection()
    {
        var clientId = 1;

        var connectionString = string.Format("Server=192.168.0.211; Database=Client_{0}; user id= USER; password = PWD;", clientId);

        using (var clientContext = new ClientContext(connectionString))
        {
            var assets = clientContext.Users.Where(s => s.UserId == 1);
        }
    }

Agregando paquetes al proyecto

Para agregar EntityFrameworkCore a su proyecto, actualice el archivo project.json (agregue nuevas líneas en las secciones dependencias y herramientas):

"dependencies": {
    ...
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
    "Microsoft.EntityFrameworkCore.Design": {
      "version": "1.0.0",
      "type": "build"
    },
},
"tools": {
    ...
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
}

No olvide ejecutar dotnet restore para descargar estos paquetes de Internet.

Si está utilizando un RDBMS que no sea Microsoft SQLServer, reemplace Microsoft.EntityFrameworkCore.SqlServer con la versión correcta (Microsoft.EntityFrameworkCore.Sqlite, Npgsql.EntityFrameworkCore.PostgreSQL u otro; consulte la documentación de su RDBMS para conocer el paquete recomendado ).