Entity Framework CoreComenzando con Entity Framework Core

Observaciones

Entity Framework (EF) Core es una versión ligera y extensible de la popular tecnología de acceso a datos de Entity Framework.

EF Core es un asignador relacional de objetos (O / RM) que permite a los desarrolladores .NET trabajar con una base de datos utilizando objetos .NET. Elimina la necesidad de la mayoría del código de acceso a datos que los desarrolladores generalmente necesitan escribir.

Añadiendo paquetes al proyecto.

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

"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 la dotnet restore para descargar estos paquetes desde 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 del RDBMS para obtener el paquete recomendado).

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

Bueno, me tomó cerca de un día resolverlo, por lo que aquí estoy publicando los pasos que seguí para hacer que mi Base de datos funcione por primera vez en un Class Project (.NET Core) , con una aplicación web básica .NET.

Paso 1 - Instalar .NET Core

Asegúrese de que está utilizando .NET Core no DNX (Hint: You should be able to see the .NET Core option when creating a New Project) - Si NO descargar desde aquí

Si tiene problemas al instalar .NET Core (el error es algo como Visual Studio 2015 Update 3 no está instalado correctamente): puede ejecutar la instalación usando el comando: [ DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1 ] - Lo que evitará que la instalación realice el problema de Visual Studio Check Github

introduzca la descripción de la imagen aquí

Paso 2 - Crear los proyectos

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

introduzca la descripción de la imagen aquí

Agregar un proyecto de Class Library (.NET Core)

introduzca 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 References

introduzca la descripción de la imagen aquí

---------------- O

Puede instalarlos usando Nuget Package Manager ejecutando los siguientes comandos en la Consola de Package Manager

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 recibe un error después de instalar

Microsoft.EntityFrameworkCore.Tools
 

Luego cambia el contenido de tu sección de frameworks project.json a esto:

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

Paso 4 - Creando el modelo de base de datos

Ahora, para generar la base de datos, ejecute el siguiente comando en la Package Manager Console (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:

introduzca la descripción de la imagen aquí

Para ello, debe agregar las mismas referencias que agregó a la Biblioteca de clases a la aplicación web .NET

Así que abre tu project.json para la aplicación web,

Bajo dependencies , agregue:

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

y bajo tools agregar:

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

Después de hacer los cambios Guardar el archivo.

Así es como se ve mi proyecto.json

introduzca la descripción de la imagen aquí

Luego, ejecute de nuevo 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, recibirá este error:

introduzca la descripción de la imagen aquí

Para resolver esta referencia adicional de la biblioteca de su clase a su aplicación web:

introduzca la descripción de la imagen aquí

Finalmente

Ejecute el comando otra vez, en la Package Manager Console :

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

introduzca la descripción de la imagen aquí

Pasando una cadena de conexión

En mi caso aquí, tenemos una aplicación Multi Tenant, en la que cada cliente tiene su propia base de datos, por ejemplo, Client_1, Client_2, Client_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);
        }
    }
 

Modelar, consultar y guardar datos.

Modelo

Con EF Core, el acceso a los datos se realiza utilizando un modelo. Un modelo está formado por 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 a mano un modelo para que coincida con su base de datos o usar EF Migrations para crear una base de datos a partir de su modelo (y evolucionar a medida que su modelo cambie 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; }
    }
}
 

Preguntando

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

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

Guardando 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();
}
 

Borrando datos

Las instancias de sus clases de entidad se recuperan de la base de datos utilizando 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();
}