ASP.NET Core - DBContext
Entity Framework le permite consultar, insertar, actualizar y eliminar data sobre la marcha. Usar objetos Common Language Runtime (CLR) llamados entidades. Entity Framework asigna las entidades y relaciones definidas en su modelo a una base de data. Tambien proporciona funcionalidad para -
-
Materializar los data devueltos desde la base de data como objetos de entidad.
-
Realice un seguimiento de los cambios en los elementos.
-
Gestione la competencia.
-
Propagar cambios de objetos a la base de data.
-
Vincular objetos a controles.
La class principal responsable de interactuar con data como objetos es DbContext. La forma recomendada de trabajar con el contexto es definir una class que se derive de DbContext y exponga las propiedades de DbSet queRepresento las colecciones de las entidades especificadas en el contexto.
Logicamente, un DBContext se asigna a una base de data especifica que tiene un esquema que el DBContext comprende. Y en esa class DBContext, puede crear propiedades de tipo DbSet . El parametro de tipo generico T sera un tipo de entidad como Empleado es una entidad en la aplicacion FirstAppDemo.
Ejemplo
Tomemos un ejemplo simple, en que vamos a crear una class DbContext. Aqui debemos agregar una nueva class en la carpeta Modelos y llamarla FirstAppDempDbContext . Aunque esta class no es un modelo en si misma, solo reune todos nuestros modelos para que podamos usarlos con la base de data.
Herede su class de contexto de la class DbContext que se encuentra en el espacio de nombres Miscrosoft.Data.Entity. Ahora implemente un DbSet de empleado en esta class.
Cada DbSet se asignara a una tabla en la base de data. tener una propiedad DbSet de empleado y el nombre deesta propiedad es Empleados, Entity Framework buscara por defecto una tabla Empleados en su base de data.
usando FirstAppDemo. Templates; utilizando Microsoft.Data.Entity; usando el sistema; utilizando System.Collections.Generic; utilizando System.Linq; usando System.Threading.Tasks; espacio de nombres OdeToFood.Models {FirstAppDemoDbContext de class publica: DbContext {DbSet publico Empleados {get; juntos; }}}
La implementacion es muy facil porque solo tenemos un modelo con el que trabajar. Solo necesitamos una propiedad, el DbSet de Employee y podemos nombrar esta propiedad Empleados .
Ahora insertemos esto class directamente en los controladores, y los controladores podrian usar FirstAppDemoDbContext para consultar la base de data. Simplificaremos todo esto agregando una nueva class a la class HomeController en la queimplementamos metodos para agregar empleados y obtener empleados como se muestra en el siguiente programa.
usando Microsoft. AspNet.Mvc; utilizando FirstAppDemo.ViewModels; utilizando FirstAppDemo.Services; utilizando FirstAppDemo.Entities; utilizando FirstAppDemo.Models; utilizando System.Collections.Generic; utilizando System.Linq; espacio de nombres FirstAppDemo.Controllers {HomeController de class publica: Controlador {Índice ViewResult publico () {var modelo = nuevo HomePageViewModel usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); model.Employees = sqlData.GetAll } return View (modelo); }} class publica SQLEmployeeData {FirstAppDemoDbContext privado _context {get; juntos; } public SQLEmployeeData (contexto FirstAppDemoDbContext) {_context = contexto; } public void Add (Empleado emp) {_context.Add (emp); _context.SaveChanges } Public Employee Get (ID int) {return _context.Employees.FirstOrDefault (e => e.Id == ID); } public IEnumerable GetAll () {return _context.Employees.ToList }} Public class HomePageViewModel {publico IEnumerable Empleados {get; juntos; }}}
En la class SQLEmployeeData anterior, puede ver que hemos definido el metodo Add que agregara un nuevo objeto de empleado al contexto y luego guardara los cambios. En el metodo Get, devolvera un empleado segun su ID. Mientras que, en el metodo GetAll, devolvera la lista de todos los empleados en la base de data.
Configuracion de los servicios de Entity Framework
Para tener un Entity Framework DBContext utilizable, necesitamos cambiar la configuracion de la aplicacion. Necesitaremos agregar una cadena de conexion para que nuestro DBContext sepa a que servidor ir y que base de data consultar.
-
Pondremos la cadena de conexion en un archivo de configuracionDuracion JSON.
-
Tambien necesitamos agregar algunos servicios adicionales durante el metodo ConfigureServices de la class Startup.
-
Entity Framework, al igual que ASP.NET y MVC, Entity Framework se basa en la inyeccion de dependencias y, para que la inyeccion funcione, El tiempo de ejecucion debe conocer los diferentes servicios que utiliza Entity Framework.
-
Existe una API de configuracion simple que agregara todos los servicios predeterminados que necesitamos.
Vayamos al archivo AppSettings.json y agreguemos la cadena de conexion como se muestra en el siguiente programa.
{ "message ": "¡Hola, mundo! Este mensaje proviene del archivo de configuracion ... ", "database ": { " connection ": " Data Source = (localdb) mssqllocaldb; Initial catalog = F irstAppDemo "}}
Ahora vayamos a la class Startup donde necesitamos agregar algunos serviciosEstos son adicionales para que Entity Framework funcione correctamente. Especificamente, hay tres cosas que debemos hacer que estan relacionadas con Entity Framework:
-
Necesitamos agregar los servicios centrales de Entity Marco de referencia.
-
Tambien necesitamos agregar el servicio Entity Framework relacionado con SQL Server.
-
Necesitamos informar a Entity Framework sobre nuestro DBContext.
Todo esto se puede hacer mediante metodos que estan disponibles como metodos de extension en IServiceCollection como se muestra en el siguiente programa.
public void ConfigureServices (servicios IServiceCollection) {services.AddMvc services.AddEntityFramework () .AddSqlServer () .AddDbContext (opcion => opcion.UseSqlServer (Configuracion [ "base de data: conexion "])); }
-
El primer metodo es AddEntityFramework . VSagregara los servicios basicos de Entity Framework, los servicios predeterminados.
-
Pero dado que Entity Framework ahora esta disenado para trabajar con diferentes tipos de bases de data, incluidas bases de data no relacionales, debemos hacer una segunda llamada para informar Entity Framework para agregar sus servicios predeterminados relacionados con SQL Server.
-
Luego, tambien debemos informar a Entity Framework sobre mi DBContext para que podamos construir instancias de esta class de manera apropiada y podemos hacerlo a traves de un tercer metodo, el metodo AddDbContext .
-
Esto tomamos un parametro de tipo generico donde especificamos el tipo de la class derivada de DBContext, el FirstAppDemoDbContext .
-
En AddDbContext, necesitamos describir las opciones para nuestro DBContext.
-
Esto se puede hacer mediante una expresion lambda ; es una accion donde recibimosTenemos un parametro de opcion y Entity Framework puede admitir diferentes bases de data. Todo lo que tenemos que hacer es decirle a Entity Framework que este DBContext en particular va a UseSqlServer.
-
Este metodo requiere un parametro que es connectionString para usar.
La siguiente es la implementacion completa del archivo Startup.cs .
usando Microsoft.AspNet.Mvc; utilizando FirstAppDemo.ViewModels; utilizando FirstAppDemo.Services; utilizando FirstA ppDemo.Entities; utilizando FirstAppDemo.Models; utilizando System.Collections.Generic; utilizando System.Linq; espacio de nombres FirstAppDemo.Controllers {Public Class HomeController: Controller {Public ViewResult Index () {var employee = new Employee {Id = 1, Name = "Mark Upston1 "}; usando (var context = new FirstAppDemoDbContext ()) {SQLEmployeeData sqlData = new SQLEmployeeData (contexto); sqlData.Add (empleado);} // var empleado = nuevo empleado {ID = 1, Nombre = "Mark Upston "}; Vista posterior (empleado); }} class publica SQLEmployeeData {FirstAppDemoDbContext privado _context {get; juntos; } public SQLEmployeeData (contexto FirstAppDemoDbContext) {_context = contexto; } public void Add (Empleado emp) {_context.Add (emp); _context.SaveChanges } Public Employee Get (ID int) {return _context.Employees.FirstOrDefault (e => e.Id == ID); } public IEnumerable GetAll () {return _context.Employees.ToList }}}
Ahora necesitamos configurar la base de data. Una forma de configurar una base de data es usar Entity Framework para crear la base de data y es un proceso de dos pasos:
El primer paso
Esto implica lo siguiente:
-
Agregar codigo de migracion a nuestro proyecto.
-
El codigo de migracion es el codigo C # . Esto se puede ejecutar para crear una base de data.en un esquema de base de data.
-
Entity Framework puede generar este codigo de migracion para nosotros.
-
Entity Framework examina la base de data y nuestros modelos y determina los cambios de esquema necesarios para que la aplicacion funcione.
-
Entonces, cuando agregamos modelos adicionales o hacemos cambios a modelos existentes, como la class Empleado, podemos seguir agregando migraciones a nuestro proyecto y mantener nuestro esquema. base de data sincronizada.
El segundo paso
Esto involucra lo siguiente -
-
Aqui necesitamos aplicar explicitamente estas migraciones para actualizar una base de data.
-
Ambas tareas se pueden realizar usando e asys desde una ventana de consola.
-
Hemos creado project.json.
-
Por eso creamos project. json para agregarter un comando donde "ef" es EntityFramework.Commands.
Vamos a abrir el simbolo del sistema del desarrollador para Visual Studio para ejecutar los comandos que necesitamos para agregar las migraciones y aplicar las migraciones. La forma mas sencilla de hacer esto es ir al directorio raiz de la aplicacion.
Si estas en la carpeta que contiene el archivo project.json, estas en la carpeta correcta. Aqui tenemos que ejecutar un comando llamado dnvm. Este es el administrador de versiones .NET que le dira al sistema que tiempo de ejecucion queremos usar.
Ahora usemos el siguiente comando.
dnvm list
Vera el siguiente resultado cuando presione Entrar.
Nosotros necesitamos decirle al dnvm que queremos usar los entornos de ejecucion especificos. Esto nos dara acceso al comando dotnet o al comando dnx que queremos ejecutar.
Ejecute el siguiente comando.
dnvmuse1.0.0 -rc1-update1 -p
Presione Enter.
dnvm configurara nuestra ruta y las variables de entorno para incluir un directorio bin que nos dara acceso a esta utilidad dnx. Ejecutemos el comando dnx ef .
Este es el entorno de ejecucion .NET, usando dnx podemos llamar a los comandos que enumeramos en nuestro archivo project.json . Ejecutar estos comandos suele ser muy simple. Cuando escribe dnx ef, obtendra una pantalla de ayuda. No tiene que recordar todas las opciones. Puede ver los comandos disponibles en de los comandos de Entity Framework y hay tres.
Primero, debemos agregar la migracion para ejecutar el siguiente comando.
dnx ef migrations add v1
Presione Enter.
Entity Framework encontrara este contexto y examinara los modelos en el. Sabra que no es 'No hay migracion previa y, por lo tanto, generara la primera migracion. Aqui, la v1 es la version 1 del badata. Creara una nueva carpeta en el Explorador de soluciones y generara codigo.
Una migracion es basicamente codigo C # utilizado para generar comandos SQL para modificar el esquema en una base de data SQL .
usando System; usando System.Collections.Generic; usando Microsoft.Data.Entity.Migrations; usando Microsoft.Data.Entity.Metadata; espacio de nombres FirstAppDemo.Migrations {public parcial class v1: Migration {anulacion protegida anulacion void Up (MigrationBuilder migrationBuilder) {migrationBuilder.CreateTable (nombre: "Empleado ", columnas: tabla => nuevo {Id = tabla.Columna (anulable: falso). Anotacion ( "SqlServer: ValueGenerationStrategy ", SqlServerValueGenerationStrategy.IdentityColumn), Name = table.Column (nullable: true)}, restricciones: table => {table.PrimaryKey ( "PK_Employee ", x => .Id);});} anulacion protegida void Down (MigrationBuilder migrationBuilder) {migrationBuilder.DropTable ( "Empleado ");}}}
Puede ver que esto creara una tabla llamada Empleados.
-
Esta tabla debe tener dos columnas: una ID y una columna de nombre.
-
Por convencion, cuando Entity Framework ve que tiene una propiedad de identificacion denominada, esto hara que esa propiedad o, mas bien, haga que esa columna sea una clave principal en el base de data.
-
Aqui usaremos SQL Server. De forma predeterminada, Entity Framework lo convertira en una IdentityColumn, lo que significa que el servidor SQL generara los ID por nosotros.
Apliquemos estos ID a una base de data escribiendo el comando " dnx ef database update ".
Puede ver que el comando aplico la migracion.
Ahora vayamos al Explorador de objetos de SQL Server y actualice la base de data, ahora puede ver que tenemos una base de data FirstAppDemo.
Puedes tambien vemos nuestra tabla de Empleados e incluso podemos mirar las columnas de esta tabla donde la columna de ID es laClave primaria.
Haga clic derecho en la tabla dbo.Employee y seleccione Mostrar data.
Antes de iniciar la aplicacion, agreguemos algunos data. Cuando lanzamos la aplicacion, deberiamos ver algunos data de la base de data.
Agreguemos algunas lineas de data aqui.
Ahora actualice el archivo de indice. cshtml. Muestra todos los data en forma tabular.
@model FirstAppDemo.Controllers.HomePageViewModel Inicio ¡Bienvenido!
@foreach (empleado var en Model.Employees) { @ Html.ActionLink (employee.Id.ToString ( ), "Detalles ", nuevo {id = employee.Id}) | @ employee.Name |
}
Una vez la aplicacion en ejecucion, deberia producir el siguiente resultado.