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
Paso 2 - Crea los proyectos
Cree una nueva aplicación web ASP.NET Core -> Luego seleccione la aplicación web en la siguiente pantalla
Agregue un proyecto Biblioteca de clases (.NET Core)
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
—————- 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:
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
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:
para resolver esto, agregue la referencia de su biblioteca de clases a su aplicación web:
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.
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 ).