Tutoriales informáticos ¿Cómo crear un sitio Web? Aprende a dominar Wordpress Incrementa tu visibilidad (SEO) Servicios de alojamiento web L'actualité, guides et tutoriaux du moment
HébergementWebs.com : L'actualités, guides et tutoriaux du moment
Nuestros servicios
SEO
Wordpress
Sitio Web
Tutoriales
L'actualité, guides et tutoriaux du moment

Entity Framework - Guía rápida

Tutorial de Entity Framework
2020-11-20 04:35:52

Entity Framework - Guia rapida


Entity Framework - Descripcion general

¿Que es Entity Framework?

Entity Framework se lanzo por primera vez en 2008, el principal medio de interaccion de Microsoft entre las aplicaciones .NET y las bases de data relacionales. Entity Framework es un Object Relational Mapper (ORM) que es un tipo de herramienta que simplifica el mapeo entre objetos en su software y tablas y columnas en una base de data relacional.

  • Entity Framework (EF) es un marco ORM de codigo abierto para ADO.NET que forma parte de .NET Framework.

  • Un ORM se encarga de crear conexiones de base de data y ejecutar comandos, asi como de tomar los resultados de las consultas y materializarlos automaticamente como objetos. solicitud.

  • Un ORM tambien puede realizar un seguimiento de los cambios realizados en estos objetos y cuandoSi se le solicita, tambien mantendra esos cambios en la base de data.

¿Por que Entity Framework?

Entity Framework es un ORM y los ORM tienen como objetivo aumentar la productividad del desarrollador al reducir la tarea redundante de los data persistentes utilizados en las aplicaciones.

  • Entity Framework puede generar los comandos de base de data necesarios para leer o escribir data ng en la base de data y ejecutarlos para usted.

  • Si esta realizando consultas, puede expresar sus consultas contra objetos en su dominio usando LINQ to entidades.

  • Entity Framework ejecutara la consulta adecuada contra la base de data y luego materializara los resultados en instancias de los objetos de su dominio para que pueda trabajar en su aplicacion.

Hay otros MNO en el mercado como NHibernatey LLBLGen Pro. La mayoria de los ORM suelen asignar tipos de dominio directamente al esquema de la base de data.

 Entity Framework - Guia rapida

Entity Framework tiene una capa de mapeo mas granular para que pueda personalizar mapp, por ejemplo, mapeando la entidad unica a varias tablas de base de data o incluso varias entidades a una sola tabla.

Entity Framework - Guia rapida

  • Entity Framework es la tecnologia de acceso a data recomendada por Microsoft para nuevas aplicaciones.

  • ADO.NET parece referirse directamente a la tecnologia de conjuntos de data y tablas de data.

  • Entity Framework es donde se realizan todas las inversiones futuras, que ha sido el caso durante varios anos.

  • Microsoft recomienda que utilice Entity Framework en ADO.NET o LINQ to SQL para cualquier nuevo desarrollo.

Modelo conceptual

Para desarrolladores de habitosDebido al desarrollo impulsado por bases de data, el mayor cambio con Entity Framework es que le permite concentrarse en su area de negocios. ¿Que desea que haga su aplicacion sin estar limitado por lo que la base de data es capaz de hacer?

  • Con Entity Framework, el punto focal se llama modelo conceptual. Este es un modelo de los objetos en su aplicacion, no un modelo de la base de data que usa para contener los data de su aplicacion.

  • Su modelo conceptual puede alinearse con su base de data de esquema o puede ser bastante diferente.

  • Puede utilizar un disenador visual para definir su modelo conceptual, que luego puede generar las classs que finalmente utilizara en su aplicacion.

  • Puede simplemente definir sus classs y usar una caracteristica de Entity Framework llamada Code First. Y podriaEntity Framework incluira el modelo conceptual.

En cualquier caso, Entity Framework explica como pasar de su modelo conceptual a su base de data. Para que pueda consultar los objetos de su modelo conceptual y trabajar directamente con ellos.

Caracteristicas

Estas son las caracteristicas basicas de Entity Framework. Esta lista se crea en funcion de las caracteristicas mas notables y tambien de las preguntas frecuentes sobre Entity Framework.

  • Entity Framework es una herramienta de Microsoft.
  • Entity Framework se desarrolla como un producto de codigo abierto.
  • Entity Framework ya no esta vinculado ni depende del ciclo de lanzamiento de .NET.
  • Funciona con cualquier base de data relacional de Entity Framework valida
  • Genere comandos SQL desde LINQ to Entities.
  • Entity Framework creara consultas parametrizadas.
  • Sigue mcambios realizados en objetos en la memoria.
  • Permite insertar, actualizar y eliminar la generacion de comandos.
  • Trabaja con un modelo visual o con sus propias classs.
  • Entity Framework tiene soporte para procedimientos almacenados.

Entity Framework - Arquitectura

La arquitectura de Entity Framework de abajo hacia arriba consta de los siguientes elementos:

Proveedores de data

Estos son proveedores especificos de la source, que resumen las interfaces ADO.NET para conectarse a la base de data cuando se programa con el esquema conceptual.

Traduce lenguajes SQL comunes como LINQ a traves del arbol de comandos a una expresion SQL nativa y lo ejecuta en un sistema DBMS especifico.

Entity Client

Esta capa expone la capa de entidad a la capa superior. El cliente de entidad permite a los desarrolladores trabajar en entidades en forma de lineas y coPuede hacer esto utilizando consultas de entidad SQL sin necesidad de generar classs para representar el esquema conceptual. Entity Client muestra las capas de la estructura de la entidad, que son la funcionalidad principal. Estas capas se denominan modelo de data de entidades.

 Entity Framework - Guia rapida

  • La capa de almacenamiento contiene todo el esquema de la base de data en formato XML.

  • La capa de 'entidad , que tambien es un archivo XML, define entidades y relaciones.

  • La capa de mapeo es un archivo XML que mapea entidades y relaciones definidas en la capa conceptual con relaciones reales y tablas definidas en la capa logica.

  • servicios de data que tambien estan representados en Entity Client proporcionan una API centralizada para acceder a los data almacenados en las capas Entity, Mapping y Storage.

Object Servicio

La capa de servicios de objetos es el contexto del objeto, que representa la sesion de interaccion entre las aplicaciones y la source de data.

  • El uso principal del contexto del objeto es realizar diferentes operaciones como agregar, eliminar instancias de entidad y guardar el estado cambiado en la base de data mediante consultas.

  • Esta es la capa ORM de Entity Framework, que representa el resultado de los data para las instancias de objeto de las entidades.

  • Estos servicios permiten a los desarrolladores utilizar algunas de las funciones enriquecidas de ORM, como el mapeo de claves primarias, el seguimiento de cambios, etc. escribiendo consultas utilizando LINQ y Entity SQL.

Entity Framework - Configuracion del entorno

¿Que hay de nuevo en Entity Framework 6?

Framework tiene una API compleja que le permite evitarControl granular sobre todo, desde su modelado hasta su comportamiento en tiempo de ejecucion. Parte de Entity Framework 5 vive dentro de .NET. Y otra parte esta dentro de un ensamblado adicional que se distribuye mediante NuGet.

  • La funcionalidad basica de Entity Framework esta integrada en. NET Framework.

  • La compatibilidad con Code First es lo que permite a Entity Framework usar classs en lugar de un modelo visual, y una API mas ligera para la interaccion con EF esta en el paquete NuGet.

  • El kernel es lo que proporciona las consultas, el seguimiento de cambios y toda la transformacion de sus consultas en consultas SQL, asi como la devolucion de data en objetos.

  • Puede usar el paquete EF 5 NuGet con .NET 4 y con .NET 4.5.

  • Un gran punto de confusion: .NET 4.5 agrego soporte para enumeraciones y data espaciales para API core de Entity Framework, lo que significa que si esta utilizando EF 5 con .NET 4, no obtendra estas nuevas funciones. Solo los obtendra al combinar EF5 con .NET 4.5.

Ahora echemos un vistazo a Entity Framework 6. Las API principales que estaban en Dentro de .NET en Entity Framework 6 ahora son parte del paquete NuGet.

Esto significa -

  • Todo Entity Framework vive en este ensamblado que es distribuido por NuGet

  • No dependera de usted. NET para proporcionar una funcionalidad especifica, como compatibilidad con la enumeracion de Entity Framework y compatibilidad con data especiales.

  • Vera que una de las caracteristicas de EF6 es que admite enumeraciones y data espaciales para .NET 4

Para comenzar a trabajar en Entity Framework, debe instalar elsiguientes herramientas de desarrollo -

  • Visual Studio 2013 o superior
  • SQL Server 2012 o superior
  • Actualizaciones Actualizar Entity Framework desde el paquete NuGet

Microsoft proporciona una version gratuita de Visual Studio que tambien contiene SQL Server y se puede descargar desde www.visualstudio.com .

Instalacion

Paso 1 - Una vez completada la descarga, ejecute el instalador. La siguiente caja de dialogo aparece.

 Entity Framework - Guia rapida

Paso 2 : haga clic en el boton Instalar y el proceso de instalacion comenzara.

Entity Framework - Guia rapida

Paso 3 - Una vez que se complete el proceso de instalacion, vera el siguiente cuadro de dialogo. Cierre este cuadro de dialogo y reinicie su computadora si es necesario.

 Entity Framework - Guia rapida

Paso 4 - Abra Visual Studio desde el menu Inicio, que abrira lo siguiente. Esta sera la primera vez que se prepare.

 Entity Framework - Guia rapida

Paso 5 - Una vez que todo este hecho, vera la ventana principal de Visual Studio.

 Entity Framework - Guia rapida

Creemos un nuevo proyecto desde Archivo → Nuevo → Proyecto

Entity Framework - Guia rapida

Paso 1 : seleccione la aplicacion de consola y haga clic en el boton Aceptar.

Paso 2 : en el Explorador de soluciones, haga clic derecho en su proyecto.

 Guia rapida de Entity Framework

Paso 3 : seleccione Administrar paquetes NuGet como se muestra en 'imagen de arriba, que abrira la siguiente ventana en Visual Studio.

 Entity Framework - Guia rapida

Paso 4 : busque Entity Framework e instalelo ultima version presionando el boton de instalacion.

 Entity Framework - Guia rapida

Paso 5 - Haga clic en Aceptar. Cuando se complete la instalacion, vera el siguiente mensaje en la ventana de salida.

 Guia rapida de Entity Framework

Ahora esta listo para iniciar su aplicacion.

Entity Framework - Configuracion de la base de data

En este tutorial usaremos una base de data universitaria simple. Una base de data academica puede ser mucho mas compleja en su conjunto, pero para fines de demostracion y aprendizaje utilizamos la forma mas simple de esta base de data. El siguiente diagrama contiene tres tablas.

  • Estudiante
  • Curso
  • Inion

 Guia rapida de Entity Framework

Siempre que se utiliza una base de data de terminos, una cosa viene directamente a nosotros mente y es un tipo diferente de tablas que tiene algun tipo de relacion. Hay tres tipos de relacion entre tablas y la relacion entre diferentes tablas depende de como se definen las columnas asociadas.

  • Relacion de uno a varios
  • Relacion de varios a varios
  • Uno a variosieurs -Una relacion

Relacion uno a muchos

La relacion uno a muchos es el tipo de relacion mas comun. En este tipo de relacion, una fila de la tabla A puede tener varias filas coincidentes en la tabla B, pero una fila de la tabla B solo puede tener una fila coincidente en la tabla A. Por ejemplo, en el diagrama arriba, la tabla de estudiantes e iniones tiene una relacion a muchos, cada estudiante puede tener multiples iniones, pero cada inion pertenece a un solo estudiante.

Relacion de muchos a muchos

En una relacion de muchos a muchos, una fila de la Tabla A puede tener muchas filas coincidentes en la Tabla B y viceversa. Se crea una relacion de este tipo definiendo una tercera tabla, denominada tabla de union, cuya clave principal esta formada por las claves externas de las tablas A y B. Por ejemplo, las tablas Student y Course tienen una relacion de varios a varios definida poruna relacion de uno a muchos entre cada una de estas tablas y la tabla inion.

Relacion uno a uno

En una relacion uno a uno, una fila en la tabla A no puede tener mas de una fila coincidente en la tabla B, y viceversa. Se crea una relacion uno a uno si las dos columnas asociadas son claves primarias o tienen restriccionesunicas.

Este tipo de relacion no es comun ya que la mayor parte de la informacion vinculada de esta manera seria todo en uno como una tabla. Puede utilizar una relacion uno a uno para -

  • Dividir una tabla con varias columnas.
  • Aisle parte de una tabla por razones de seguridad.
  • Almacene data de corta duracion que podrian eliminarse facilmente simplemente soltando la tabla.
  • Almacene informacion que solo se aplica a un subconjunto de la tabla principal.

Entity Framework - Modelo de data

El modelo de data de entidad (EDM) ees una version extendida del modelo Entidad-Relacion que especifica el modelo conceptual de los data utilizando varias tecnicas de modelado. tambien se refiere a un conjunto de conceptos que describen la estructura de los data, independientemente de su forma almacenada.

EDM admite un conjunto de tipos de data primitivos que definen propiedades en un modelo conceptual. Tenemos que considerar 3 partes principales que forman la base de Entity Framework y colectivamente se conocen como Entity Data Model. Aqui estan las tres partes principales de EDM.

  • El modelo de esquema de almacenamiento
  • El modelo conceptual
  • El modelo de mapeo

El modelo de esquema de almacenamiento

El modelo de almacenamiento tambien conocido como Capa de definicion de esquema de almacenamiento (SSDL) representa la representacion esquematica del almacen de data de backend.

 Entity Framework - Guia rapida

El modelo conceptual

La mEl modelo conceptual, tambien conocido como capa de definicion de esquema conceptual (CSDL), es el modelo de entidad real en el que escribimos nuestras consultas.

El modelo de mapeo

Mapeo La capa es solo un mapeo entre el modelo conceptual y el modelo de almacenamiento.

El esquema logico y su asignacion al esquema fisico se representan como EDM.

  • Visual Studio tambien proporciona Entity Designer, para la creacion visual de EDM y especificacion de mapeo.

  • La salida de la herramienta es el archivo XML (* .edmx) que especifica el esquema y la asignacion.

  • El archivo Edmx contiene artefactos de data de Entity Framework.

Schema Definition Language

ADO.NET Entity Framework utiliza un lenguaje de definicion de data basado en XML llamado Schema Definition Language (SDL) para definir el esquema EDM.

  • El SDL define els tipos simples de la misma manera que otros tipos primitivos, incluidos String, Int32, Double, Decimal y DateTime, entre otros.

  • Una enumeracion, que define un mapa de valores y nombres primitivos, tambien se considera un tipo simple.

  • Las enumeraciones solo son compatibles con la version 5.0 del marco.

  • Los tipos complejos se crean a partir de una agregacion de otros tipos. Una coleccion de propiedades de estos tipos define un tipo de entidad.

El modelo de data tiene principalmente tres conceptos clave para describir la estructura de data:

  • Tipo d 'entidad
  • Tipo de asociacion
  • Propiedad

Tipo de entidad

El tipo de entidad es el bloque de construccion fundamental para describir la estructura de data en EDM.

  • En un modelo conceptual, los tipos de entidades se construyen por separadoir y describir la estructura de conceptos de nivel superior, como estudiantes e iniones en una aplicacion empresarial.

  • Una entidad representa un objeto especifico, como un alumno especifico o inion.

  • Cada entidad debe tener una clave de entidad unica en un conjunto de entidades. Un conjunto de entidades es una coleccion de instancias de un tipo de entidad especifico. Los conjuntos de entidades (y los conjuntos de asociaciones) se agrupan logicamente en un contenedor de entidades.

  • La herencia se admite con tipos de entidad, es decir, se puede derivar un tipo de entidad de otro.

 Entity Framework - Guia rapida

Tipo de asociacion

Es otro bloque de construccion fundamental para describir las relaciones en EDM. En un modelo conceptual, una asociacion representa una relacion entre dos tipos de entidades como Estudiante y Matricula.

  • Cada asociaciontiene dos extremos de asociacion que especifican los tipos de entidades involucradas en la asociacion.

  • Cada extremo de asociacion tambien especifica una multiplicidad de extremos de asociacion que indica el numero de entidades que pueden estar en ese extremo de asociacion.

  • Una multiplicidad de fin de asociacion puede tener un valor de uno (1), cero o uno (0..1), o mas (*).

  • Se puede acceder a las entidades en un extremo de una asociacion a traves de propiedades de navegacion, o mediante claves externas si se exponen en un tipo de entidad.

Propiedad

Los tipos de entidad contienen propiedades que definen su estructura y caracteristicas. Por ejemplo, un tipo de entidad Estudiante puede tener propiedades como Id. De estudiante, Nombre, etc.

Una propiedad puede contener data primitivos (como una cadena, un numero entero o un valor booleano) o data estructurados (como un tipo complejo).

Entity Framework - DbContext

Entity Framework le permite consultar, insertar, actualizar y eliminar data, utilizando Objetos Common Language Runtime (CLR) que se conocen como 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 por la base de data como objetos de entidad
  • Seguimiento cambios en los objetos
  • Administrar la simultaneidad
  • Propagar cambios en los objetos a la base de data
  • Vincular objetos a los controles

La class principal responsable de interactuar con data como objetos es System.Data.Entity.DbContext. La API de DbContext no se publica como parte de .NET Framework. En o Con el fin de ser mas flexibles y frecuentes con la publicacion de nuevoss en Code First y la API DbContext, el equipo de Entity Framework distribuye EntityFramework.dll a traves de la funcion de distribucion NuGet de Microsoft.

  • NuGet le permite agregar referencias a sus proyectos .NET extrayendo las DLL relevantes directamente en su proyecto desde la web.

  • Una extension de Visual Studio llamada Library Package Manager proporciona una manera facil de extraer el ensamblaje correcto de la web a sus proyectos.

 Entity Framework - Guia rapida

  • El proposito principal de la API DbContext es simplificar su interaccion con Entity Framework.

  • Tambien reduce la cantidad de metodos y propiedades que necesita para acceder a las tareas de uso comun.

  • En versiones anteriores de Entity Framework, estas tareas a menudo eran complicadas de descubrir y codificar.

  • La class de contexto administra los objetos de entidad pedurante la ejecucion, que incluye rellenar objetos con data de una base de data, realizar un seguimiento de los cambios y conservar los data en la base de data.

Definicion de una class derivada de DbContext

La forma recomendada de trabajar con el contexto es definir una class que se derive de DbContext y exponga la Propiedades de DbSet que representan colecciones de las entidades especificadas en el contexto. Si esta trabajando con EF Designer, el contexto se generara automaticamente. Si estas trabajando con Code First, normalmente escribiras el contexto tu mismo.

El siguiente codigo es un ejemplo simple que muestra que UniContext se deriva de DbContext.

  • Puede usar propiedades automaticas con DbSet como getter y setter.

  • Esto tambien crea un codigo mucho mas limpio, pero no tiene que usarlo con el proposito de crear un DbSet cuando no tiene que hacerloNo tienes otra logica que aplicar.

public class UniContext: DbContext {public UniContext (): base ( "UniContext ") {} public DbSet Estudiantes {get; set;} public DbSet Enrollments {get; set;} public DbSet Course {get; set;}}

  • Anteriormente, EDM generaba classs de contexto derivadas de la class ObjectContext.

  • Trabajar con ObjectContext fue un poco complejo.

  • DbContext es un contenedor de ObjectContext que de hecho es similar a ObjectContext y es util y facil en todos los modelos de desarrollo, como Code First, Model First y Database Primero.

Consultas

Puede utilizar tres tipos de consultas como:

  • Adicion de una nueva entidad.
  • Modificar o actualizar los valores de propiedad de una entidad existente.
  • Eliminacion de una eentidad existente.

Agregar nuevas entidades

Agregar un nuevo objeto con Entity Framework es tan facil como crear una nueva instancia de su objeto y registrarlo usando el metodo Add en DbSet. El siguiente codigo es para cuando desee agregar un nuevo estudiante a la base de data.

vacio estatico privado AddStudent () {using (var context = new UniContext ()) {var student = new Student {LastName = "Khan ", FirstMidName = "Ali ", EnrollmentDate = DateTime.Parse ( "2005-09-01 ")}; context.Students.Add (estudiante); context.SaveChanges }}

Modificar entidades existentes

Modificar objetos existentes es tan facil como actualizar el valor asignado a la propiedad o propiedades que desea modificar y llamar desde SaveChanges. En el siguiente codigo, el apellido de Ali se ha cambiado de Khan a Aslam.

private static void AddStudent () {private static void ChangeStudent () {using (var context = new UniContext ()) {var student = (from d in context.Students donde d.FirstMidName == " Ali " seleccione d) .Single student.LastName = "Aslam context.SaveChanges }}}

Eliminando entidades existentes

Para eliminar una entidad usando Entity Framework, usa el metodo Remove en DbSet. Elimina obras de entidades existentes y recien agregadas. Llamar a Eliminar en una entidad que se ha agregado pero que aun no esta registrada en la base de data cancelara la adicion de la entidad. La entidad se elimina del seguimiento de cambios y DbContext ya no la rastrea. Llamar a Eliminar en una entidad existente a la que se realiza un seguimiento de los cambios guardara la entidad para su eliminacion la proxima vez que se llame a SaveChanges. El siguiente ejemplo muestra una instancia en la que se elimina al alumno de la base de data cuyael primer nombre es Ali.

private static void DeleteStudent () {using (var context = new UniContext ()) {var bay = (from d in context.Students donde d.FirstMidName == "Ali " seleccione d) .Single contexto.Estudiantes.Eliminar (bahia); context.SaveChanges }}

Entity Framework - Tipos

En Entity Framework, hay dos tipos de entidades que permiten a los desarrolladores usar sus propias classs de data personalizadas con la plantilla. data sin realizar cambios en las propias classs de data.

  • entidades POCO
  • Proxy dinamico

entidades POCO

  • POCO significa objetos CLR "simple-antiguo " que se pueden usar como objetos de dominio existentes con su modelo de data.

  • Las classs de data de POCO que se asignan a entidades se definen en un modelo de data.

  • Tambien se necesita thn Carga la mayoria de los mismos comportamientos de consulta, insercion, actualizacion y eliminacion como tipos de caracteristicas generadas por las herramientas del modelo de data de caracteristicas.

  • Puede utilizar el modelo POCO para generar tipos de entidad que ignoran la persistencia a partir de un modelo conceptual.

Echemos un vistazo al siguiente ejemplo de modelo de data de entidad conceptual.

Para generar entidades POCO para el modelo de entidad anterior:

Paso 1 : haga clic derecho en la ventana del disenador. Mostrara el siguiente cuadro de dialogo.

Entity Framework - Guia rapida

Paso 2 : seleccione el elemento Agregar generacion de codigo ...

Paso 3 - Seleccione el generador EF 6.x DbContext, escriba el nombre, luego haga clic en el boton Agregar.

Vera en su explorador de soluciones que se generan los modelos POCODemo.Context.tt y POCODemo.tt.

 Entity Framework - Guia rapida

La POCODemo.Context genera el DbContext y conjuntos de objetos que puede devolver y usar para consultar, por ejemplo, para el contexto, los estudiantes y los cursos, etc.

 Entity Framework - Guiof Quick

El otro modelo se ocupa de todo tipo Student, Cursos, etc. Aqui esta el codigo de la class Student que se genera automaticamente a partir del modelo de entidad.

espacio de nombres ConsoleApplication1 {usando System; usando System.Collections.Generic; estudiante de class parcial publica {[System.Diagnostics.CodeAnalysis.SuppressMessage ( "Microsoft.Usage ", " CA2214: DoNotCallOverridableMethodsInConstructors ")] public Student () {this.Enrollments = new HashSet } ID public int {get; set;} public string LastName {get; set;} public string FirstMidName {get; ensemble;} public System.DateTime EnrollmentDate {get; ensemble;} [System.Diagnostics.CodeAnalysis.SuppressMessage ( "Microsoft.Usage ", CA2227: CollectionPropertiesShouldBeReadOnly ")] public virtual ICollection Enrollments {get; set;}}}

Se generan classs similares para las tablas de curso e inion desde el modelo de entidad.

Proxy dinamico

Al crear instancias de tipos de entidad POCO, Entity Framework a menudo crea instancias de un tipo derivado generado dinamicamente que actua como un proxy para la entidad. Tambien se puede decir que es una class de proxy en tiempo de ejecucion como una class contenedora de entidad POCO.

  • Puede anular algunas propiedades de la entidad para realizar acciones automaticamente al acceder a la propiedad.

  • Este mecanismo es se utiliza para admitir la carga diferida de relaciones y el seguimiento automatico de cambios.

  • Esta tecnica tambien se aplica a los modelos creados con Code First y EF Designer.

Si desea que Entity Framework admita la cargano difiere de los objetos asociados y realiza un seguimiento de los cambios en las classs de POCO, entonces las classs de POCO deben cumplir con los siguientes requisitos:

  • La class de data personalizados debe declararse con acceso publico.

  • La class de data personalizados no debe estar sellada.

  • La class de data personalizados no debe ser abstracta.

  • La class de data personalizados debe tener un constructor publico o protegido que no tenga parametros.

  • Use un constructor protegido sin parametros t si desea que el metodo CreateObject se use para crear un proxy para la entidad POCO.

  • Llamar al metodo CreateObject no garantiza la creacion del proxy: la class POCO debe seguir los otros requisitos descritos en este tema.

  • La class no puede implementar las interfaces IEntityWithChangeTracker o IEntityWithRelaciones porque las classs de proxy implementan estas interfaces.

  • La opcion ProxyCreationEnabled debe establecerse en true.

El siguiente ejemplo es una class de entidad de proxy dinamica.

Curso de class publica parcial {Curso publico () {this.Enrollments = new HashSet } public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } Public Virtual ICollection Inions {get; juntos; }}

Para deshabilitar la creacion de objetos proxy, establezca el valor de la propiedad ProxyCreationEnabled en falso.

Entity Framework - Relaciones

En bases de data relacionales, la relacion es una situacion que existe entre tablas en la base de data relacional a traves de claves externas. Una clave externa (FK) es una columna o combinacion de columnas que se utiliza para establecer y aplicar un vinculo entre data ene dos mesas. El siguiente diagrama contiene tres tablas.

  • Estudiante
  • Curso
  • Inion

Entity Framework - Guia rapida

En el diagrama anterior, puede ver algun tipo de asociacion / relacion entre tablas. Hay tres tipos de relacion entre tablas y la relacion entre diferentes tablas depende de como esten las tablas las columnas asociadas estan definidas.

  • Relacion de uno a muchos
  • Relacion de muchos a muchos
  • Relacion de uno a muchos -to-uno

Relacion uno-a-muchos

  • Una relacion uno-a-muchos es la tipo de relacion mas comun.

  • En este tipo de relacion, una fila en la tabla A puede tener multiples filas coincidentes en la tabla B, pero una fila en la tabla B no solo puede tener una fila coincidente en la tabla A.

  • La clave externa se define en la matriz que representa el final de muchosde la relacion.

  • Por ejemplo, en el diagrama anterior, las tablas Student e Inion tienen una relacion de uno a muchos, cada estudiante puede tener multiples iniones, pero cada inion pertenece a solo un estudiante.

Dentro del marco de la entidad, estas relaciones tambien se pueden crear con codigo. A continuacion, se muestra un ejemplo de classs de estudiantes e inion que estan asociadas con una relacion de uno a varios.

estudiante de class publica {ID int publico {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} Inion de class publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Public Virtual Student Student {obtener; juntos; }}

En el codigo anterior, puede ver que la class Student contiene la coleccion de Enrollment, pero la class Enrollment solo tiene un objeto Student.

Relacion de muchos a muchos

En una relacion de muchos a muchos, una fila de la tabla A puede tener varias filas coincidentes en la tabla B y viceversa.

  • Puede crear dicha relacion definiendo una tercera tabla, denominada tabla de union, cuya clave principal se compone de claves foraneas de la tabla A y la tabla B.

  • Por ejemplo, las tablas Student y Course tienen una relacion de varios a varios que se define por una relacion de uno a varios entre cada estas tablas y la tabla inion.

El siguiente codigo contiene la class del curso y las dos classs anteriores, es decir, Estudiante y Inscripcion .

class publica Course {[DatabaseGenerated (DatabaseGeneratedOption.None)] public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

Puede ver que la class del curso y la class del estudiante tienen colecciones de objetos inion que establecen una relacion de muchos a muchos mediante la inion de class de cruce.

Relacion uno a uno

  • En una relacion uno a uno, una fila en la tabla A no puede tener mas de una fila coincidente en la tabla B, y viceversa.

  • Se crea una relacion uno a uno si las dos columnas asociadas son claves primarias o son unicas

  • En En una relacion uno a uno, la clave principal actua ademas como clave externa y no hay una columna de clave externa separada para ninguna de las tablas.

Este tipo de relacion no es comun porque elLa mayor parte de la informacion vinculada de esta manera estaria toda en una tabla. Puede utilizar una relacion uno a uno para -

  • Dividir una tabla con varias columnas.
  • Aisle parte de una tabla por razones de seguridad.
  • Almacene data de corta duracion que podrian eliminarse facilmente simplemente soltando la tabla.
  • Almacene informacion que solo se aplica a un subconjunto de la tabla principal.

El siguiente codigo le permite agregar otro nombre de class StudentProfile que contenga la identificacion de correo electronico y la contrasena del estudiante.

estudiante de class publica {ID publico int {have; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Public Virtual ICollection Inions {get; juntos; } StudentProfile public virtuel StudentProfile {get; juntos; }} public class StudentProfile {public StudentProfile () {} public int ID {get; juntos; } cadena publica Correo electronico {get; juntos; } cadena publica Contrasena {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}

Puede ver que la class de entidad Student contiene la propiedad de navegacion StudentProfile y StudentProfile contiene la propiedad de navegacion Student.

Cada alumno tiene solo un correo electronico y una contrasena para conectarse al dominio de la universidad. Esta informacion se puede agregar a la tabla de Estudiantes, pero por razones de seguridad se divide en otra tabla.

Entity Framework - Lifecycle

Lifetime

El ciclo de vida de un contexto comienza cuando se crea la instancia y finaliza cuando el instancia se elimina o recupera.

  • La vida util del contexto es una decision muy importante que se debe tomar al utilizarde ORM.

  • El contexto funciona como un cache de entidad, lo que significa que si contiene referencias a todas las entidades cargadas, puede aumentar muy rapidamente el consumo de memoria y tambien puede provocar perdidas de memoria.

  • En el diagrama a continuacion, puede ver el nivel superior del flujo de trabajo de data desde la aplicacion a la base de data a traves del contexto y viceversa.

 Entity Framework - Guia rapida

Ciclo de vida de la entidad

El ciclo de vida de la entidad describe el proceso en el que se crea una entidad, agregado, modificado, eliminado, etc. Las entidades tienen muchos estados durante su vida. Antes de ver como recuperar el estado de la entidad, echemos un vistazo a cual es el estado de la entidad. 'entidad. El estado es una enumeracion de tipo System.Data.EntityState que declara los siguientes valores -

  • Agregado: La entidad esta marcada como agregada.

  • Eliminado: la entidad se marca como eliminada.

  • Modificado: La entidad ha sido modificada.

  • Sin cambios: la entidad no ha sido modificada.

  • Independiente: No se realiza el seguimiento de la entidad.

Cambios de estado en el ciclo de vida de la entidad

A veces, el estado de las entidades se establece automaticamente por contexto, pero El desarrollador tambien puede cambiarlo manualmente. Incluso si todas las combinaciones de cambios de un estado a otro son posibles, algunas de ellas no tienen sentido. Por ejemplo, una entidad agregada en el estado eliminada o viceversa.

Hablemos de los diferentes estados.

Estado sin cambios

  • Cuando una entidad no cambia, esta vinculada al contexto pero no ha sido modificado.

  • De forma predeterminada, una entidad recuperada de la base de data se encuentra en este estado.

  • Cuando una entidad se adjunta al contexto (con el metodo Attach), tambien esta en el estado sin cambios.

  • El contexto no puede realizar un seguimiento de los cambios en los objetos a los que no hace referencia, por lo que cuando se adjuntan, se asume que no han cambiado.

Estado independiente

  • Separado es el estado predeterminado de una entidad recien creado porque el contexto no puede seguir la creacion de ningun objeto en su codigo.

  • Esto es cierto incluso si crea una instancia de la entidad dentro de un bloque de uso del contexto.

  • Separado es incluso el estado de las entidades recuperadas de la base de data cuando el seguimiento esta deshabilitado.

  • Cuando una entidad esta separada, no esta vinculada al contexto, por lo que no se realiza un seguimiento de su estado.

  • Puede eliminarse, modificarse, usarse en combinacion con otras classs o usarse de cualquier otra forma necesaria.

  • ComPara mi, no hay seguimiento de contexto, no tiene significado para Entity Framework.

Estado agregado

  • Cuando una entidad esta en el estado Agregado, tienes pocas opciones. De hecho, solo puede separarlo del contexto.

  • Por supuesto, incluso si cambia una propiedad, el estado permanece Agregado, porque moverlo a Modificado, Sin cambios o Eliminado no tiene ningun sentido.

  • Esta es una entidad nueva y no coincide con ninguna fila de la base de data.

  • Este es un prerrequisito fundamental para estar en uno de estos estados (pero esta regla no la impone el contexto).

Estado modificado

  • Cuando se cambia una entidad, significa que estaba en el estado Sin cambios y se ha cambiado una propiedad.

  • Una vez que una entidad ha entrado en el estado Modificado, puede entrar en el estado DetalMarcado o Eliminado, pero no puede volver al estado Sin cambios incluso si restaura manualmente los valores originales.

  • Ni siquiera se puede cambiar a Agregado, a menos que separe y agregue la entidad al texto de contexto, porque ya existe una linea con este ID en la base de data. data, y obtendria una excepcion de tiempo de ejecucion mientras persistiera.

Estado eliminado

  • Una entidad entra en estado Eliminado porque sin cambios o modificados, se utilizo el metodo DeleteObject.

  • Este es el estado mas restrictivo, porque no hay necesidad de cambiar este estado a ningun valor que no sea Separado.

El uso si desea que todos los recursos controlados por el contexto se eliminen al final del bloque. Cuando usa la instruccion using , el compilador crea automaticamente un bloque try / finalmente y llama a dispose en el bloque finalmente.

usando (var context = new UniContext ()) {var student = new Student {LastName = "Khan ", FirstMidName = "Ali ", EnrollmentDate = DateTime.Parse ( "2005-09-01 ")}; context.Students.Add (estudiante); context.SaveChanges }

Cuando trabaje con un contexto a largo plazo, considere lo siguiente:

  • A medida que avanza a medida que carga mas objetos y sus referencias en la memoria, el consumo de memoria de contexto puede aumentar rapidamente. Esto puede provocar problemas de rendimiento.

  • Recuerde eliminar el contexto cuando ya no sea necesario.

  • Si una excepcion hace que el contexto este en un estado irrecuperable, la aplicacion completa puede terminar.

  • Las posibilidades de encontrar problemas relacionados con la concurrencia aumentan a medida que la brecha entre el momento en que los data son consultas y las actualizacionesgemido.

  • Cuando trabaje con aplicaciones web, use una instancia de contexto por solicitud.

  • Cuando trabaje con Windows Presentation Foundation (WPF) o Windows Forms, use una instancia de contexto por formulario. Esto le permite utilizar la funcionalidad de seguimiento de cambios proporcionada por el contexto.

Reglas basicas

Aplicaciones web

  • Ahora es una practica comun y recomendada que para las aplicaciones web, el contexto se utilice por solicitud.

  • En las aplicaciones web, estamos tratando con solicitudes que son muy cortas pero toman toda la traccion del servidor, por lo que tienen el tiempo apropiado para vivir en el contexto.

Aplicaciones de escritorio

  • Para aplicaciones de escritorio , como Win Forms / WPF, etc., el contexto es utilizado por formulario / cuadro de dialogogue / pagina.

  • Dado que no queremos tener el contexto como un singleton para nuestra aplicacion, lo tendremos disponible cuando cambiemos de un formulario a otro.

  • De esta manera ganaremos mucho contexto y no sufriremos las implicaciones de contextos duraderos.

Entity Framework - Code First Approach

Entity Framework ofrece tres enfoques para crear un modelo de entidad y cada uno tiene sus ventajas y sus inconvenientes.

  • Primero el codigo
  • Primero la base de data
  • Primero el modelo

En este capitulo, describiremos brevemente el primer enfoque del codigo. Algunos desarrolladores prefieren trabajar con Designer en codigo, mientras que otros simplemente prefieren trabajar con su codigo. Para estos desarrolladores, Entity Framework tiene un flujo de trabajo de modelado llamado Code First.

  • El flujo de trabajo de modeladoCode First apunta a una base de data que no existe y Code First la creara.

  • Tambien se puede usar si tiene una base de data vacia, entonces Code First tambien agregara nuevas tablas.

  • Code First le permite definir su modelo usando classs C # o VB.Net.

  • La configuracion adicional se puede hacer opcionalmente usando atributos en sus classs y propiedades o usando una API fluida.

Entity Framework - Guia rapida

¿Por que Code First?

  • Code First esta en compuesto por un conjunto de piezas de rompecabezas. Primero, sus classs de dominio.

  • Las classs de dominio no tienen nada que ver con Entity Framework. No son que los elementos de su dominio profesional.

  • Entity Framework, por lo tanto, tiene un contexto que administra la interaccion entre estas classs y su base de data.

  • El contexto no es spespecifico de Code First. Es una caracteristica de Entity Framework.

  • Code First agrega un generador de modelos que inspecciona sus classs basadas en el contexto, luego usa un conjunto de reglas o convenciones para determinar como esas classs y relaciones describen un modelo y como se debe asignar este modelo a su base de data.

  • Todo esto sucede en tiempo de ejecucion. Nunca veras este modelo, solo esta en la memoria.

  • Code First tiene la opcion de usar esta plantilla para crear una base de data si es necesario.

  • Tambien puede actualizar la base de data si el modelo cambia, usando una funcion llamada Code First Migrations.

Entity Framework: primer enfoque del modelo

En este capitulo, aprendamos como crear un modelo de data de entidad en el disenador usando el flujo de trabajo llamado Model First.

  • Model Firstes ideal cuando esta comenzando un nuevo proyecto donde la base de data ni siquiera existe todavia.

  • El modelo se almacena en un EDMX y se puede ver y editar en Entity Framework Designer.

  • En Model First, usted define su modelo en un disenador de Entity Framework, luego genera SQL, que creara un esquema de base de data para que coincida con su modelo, luego ejecute el SQL para crear el esquema en su base de data.

  • Las classs con las que interactua en su aplicacion se generan automaticamente a partir del archivo EDMX.

Aqui hay un ejemplo simple de como crear un nuevo proyecto de consola usando el enfoque Model First.

Paso 1 : abra Visual Studio y seleccione Archivo → Nuevo → Proyecto

Paso 2 : seleccione Instalado → Plantillas → Visual C # → Windows en el panel izquierdo, luego en el panel central, seleccione Applicacion de consola.

Paso 3 : ingrese EFModelFirstDemo en el campo Nombre.

Paso 4 : para crear una plantilla, primero haga clic con el boton derecho en el proyecto de su consola en el Explorador de soluciones y seleccione Agregar → Nuevos elementos…

 Entity Framework - Guia rapida

Se abre el siguiente cuadro de dialogo.

Entity Framework - Guia rapida

Paso 5 - Seleccione ADO.NET Entity Data Model en el panel central e ingrese el nombre ModelFirstDemoDB en el campo Nombre.

Paso 6 : haga clic en el boton Agregar, que abrira el cuadro de dialogo Asistente de modelo de data de entidad.

 Entity Framework - Guia rapida

Paso 7 : seleccione la plantilla Empty EF Designer y haga clic en el boton Siguiente. El disenador de Entity Framework se abre con una plantilla vacia. Ahora podemos comenzar a agregar entidades, propiedades y asociaciones al modelo.

Paso 8 : haga clic derecho en la superficie de diseno y seleccione Propiedades. En la ventana Propiedades, cambie el nombre del contenedor de la entidad a ModelFirstDemoDBContext.

 Entity Framework - Guia rapida

Paso 9 : haga clic con el boton derecho en la superficie de diseno y seleccione Agregar nuevo → Entidad ...

 Entity Framework - Guia rapida

Se abre el cuadro de dialogo Agregar entidad como se muestra en la siguiente imagen.

Paso 10 : ingrese Student como nombre de entidad y Student Id como nombre de propiedad y haga clic en Aceptar.

 Entidad Marco - Guia rapida

Paso 11 - Haga clic derecho en la nueva entidad en la superficie de diseno y seleccione Agregar nuevo → Propiedad escalar , ingrese Nombre para el nombre de la propiedad.

 Entity Framework - Guia rapida

Paso 12 : ingrese el nombre y luego agregue dos otras propiedades escalares como LastName y EnrollmentDate.

 Entity Framework - Guia rapida

Paso 13 : agrega dos cursos de entidad mas e Inion siguiendo todos los pasos mencionados anteriormente y tambien agregando algunas propiedadesveranos escalares como se muestra en los siguientes pasos.

 Entity Framework - Guia rapida

Paso 14 : tenemos tres entidades en Visual Designer, agreguemos una asociacion o relacion entre ellos.

Paso 15 : haga clic con el boton derecho en la superficie de diseno y seleccione Agregar nuevo → Asociacion ...

 Entity Framework - Guia rapida

Paso 16 - Senale un extremo de la relacion con Student con una multiplicidad de uno y el otro extremo con Inion con una multiplicidad de muchos.

 Entity Framework - Guia rapida

Paso 17 : esto significa que un estudiante tiene muchos inions y el inion es propiedad de un estudiante.

Paso 18 : asegurese de que la casilla Agregar propiedades de clave externa a la entidad 'Publicar ' este marcada y haga clic en Aceptar .

Paso 19 : del mismo modo, agregue otra asociacion entre Cours e Inion.

 Entity Framework - Guia rapida

Paso 20 : su modelo de data se vera como la siguiente pantalla despues de agregar 'asociaciones entre entidades.

 Entity Framework - Guia rapida

Ahora tenemos un modelo simple a partir del cual podemos generar una base de data y usarla para leer y escribir data. Vamos a generar la base de data data.

Paso 1 : haga clic con el boton derecho en la superficie de diseno y seleccione Generar base de data a partir del modelo ...

 Entity Framework - Guia rapida

Paso 2 : puede seleccionar una base de data existente o crear una nueva conexion haciendo clic en en Nueva conexion…

 Guia rapida de Entity Framework

Paso 3 - Para crear una nueva base de data, haga clic en Nueva conexion…

 Entity Framework - Guia rapida

Paso 4 : ingrese el nombre del servidor y el nombre de la base de data .

Paso 5 : haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 6 : haz clic en Finalizar. Esto agregara el archivo * .edmx.sql al proyecto. Puede ejecutar DDL en Visual Studio abriendo el archivo .sql, luego haga clic derecho y seleccione Ejecutar.

 Entity Framework - Guia rapida

Paso 7 : la caja Se mostrara el siguiente cuadro de dialogo para conectarse a la base de data.

Entity Framework - Guia rapida

Paso 8 : si tiene exito, vera el siguiente mensaje.

 Entity Framework - Guia rapida

Paso 9 : vaya al explorador del servidor, vera que la base de data se crea con tres tablas especificadas.

 Entity Framework - Guia rapida

A continuacion, debemos intercambiar nuestro modelo para generar codigo que use la API DbContext.

Paso 1 - Haga clic derecho en una ubicacion vacia de su modelo en EF Designer y seleccione Agregar elemento de generacion de codigo…

 Entity Framework Quick Guide

Vera que se abre el siguiente cuadro de dialogo Agregar nuevo elemento.

 Entity Framework - Guia rapida

Paso 2 - Seleccione EF 6.x DbContext Generator en el panel central e ingrese ModelFirstDemoModel en el campo Nombre.

Paso 3 : vera en el explorador de soluciones que se generan los modelos ModelFirstDemodel.Context.tt y ModelFirstDemoModel.tt.

 Entity Framework - Guia rapida

El ModelFirstDemodel.Context genera el DbCcontext y conjuntos de objetos que puede devolver y usar para realizar consultas, por ejemplo, por contexto, estudiantes y cursos, etc. .

La otra plantilla se ocupa de todo tipo de estudiantes, cursos, etc. Aqui esta la class Student, que se genera automaticamente a partir del modelo de entidad.

 Guia rapida de Entity Framework

Aqui esta el codigo C # en el que se ingresan y recuperan algunos data de la base de data.

using System; using System.Linq; namespace EFModelFirstDemo {class Program {static void Main (string args) {using (var db = new ModelFirstDemoDBContext ()) {// Create y registre una nueva Consola de estudiante. Escriba ( "Ingrese un nombre para un nuevo estudiante: "); var firstName = Console.ReadLine var estudiante = nuevo estudiante {StudentID = 1, FirstName = firstName}; db.Students .Add (estudiante); db.SaveChanges var query = from b in db.Students orderby b.FirstName select b; Console.WriteLine ( "Todos los estudiantes en la base de data: "); foreach (elemento var en la solicitud) {Console.WriteLine (element.FirstName); } Console.WriteLine ( "Presione cualquier tecla para salir ... "); Console.ReadKey }}}}

Cuando se ejecuta el codigo anterior, recibira el siguiente resultado:

Ingrese un nombre para un nuevo estudiante: Ali Khan Todos los estudiantes en la base de data: Ali Khan Presione cualquier tecla para salir ...

Le recomendamos que ejecute el ejemplo anterior paso a paso para Una mejor comprension.

Entity Framework - Primer enfoque de la base de data

En este capitulo, aprendamos como crear un modelo de data de entidad con el enfoque de Database First.

  • El enfoque Database First proporciona una alternativa a los enfoques Code First y Model First del modelo de data de entidad. Crea codigos de modelo (classs, propiedades, DbContext, etc.) a partir de la base de data del proyecto y estas classs se convierten en el enlace entre la base de data y el controlador.

  • El primer acercamiento a la base de data crea el marco de la entidad a partir de una base de data existente. Usamos todas las demas caracteristicas, como la sincronizacion del modelo / base de data y la generacion de codigo, de la misma manera que las usamos en el enfoque Model First.

Tomemos un ejemplo simple. Ya tenemos una base de data que contiene 3 tablas como se muestra en la siguiente imagen.

 Entity Framework - Guia rapida

Paso 1 : creemos un nuevo proyecto de consola con el nombre DatabaseFirstDemo.

Paso 2 : para crear la plantilla, primero haga clic derecho en suproyecto de consola en el Explorador de soluciones y seleccione Agregar → Nuevos elementos…

Paso 3 - Seleccione ADO.NET Entity Data Model en el panel inactivo e ingrese el nombre DatabaseFirstModel en el campo Nombre.

Paso 4 - Haga clic en el boton Agregar que abrira el cuadro de dialogo Entity Data Model Wizard.

Paso 5 : seleccione EF Designer de la base de data y haga clic en el boton Siguiente.

Entity Framework - Guia rapida

Paso 6 : seleccione la base de data existente y haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 7 : elija Entity Framework 6 .xy haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 8 - Seleccione todas las vistas y tablas de procedimientos almacenados que desee incluir y haga clic en Finalizar.

Vera t El modelo de entidad y las classs de POCO se generan a partir de la base de data.

 Entity Framework - Guia rapida

ObtenerAhora tenemos a todos los estudiantes en la base de data escribiendo el siguiente codigo en el archivo program.cs.

usando el sistema; utilizando System.Linq; espacio de nombres DatabaseFirstDemo {class Program {static void Main (string args) {using (var db = new UniContextEntities ()) {var query = from b in db.Students orderby b.FirstMidName select b; Console.WriteLine ( "Todos Todos los estudiantes de la base de data: "); foreach (var elemento en solicitud) {Console.WriteLine (elemento.FirstMidName+" + elemento.LastName); } Console.WriteLine ( "Presione cualquier tecla para salir ... "); Console.ReadKey }}}}

Cuando se ejecuta el programa anterior, recibira el siguiente resultado:

Todos los estudiantes en la base de data: Ali Khan Arturo final y Bill Gates Carson Alexander Gyti s Barzdukas Laura Norman Meredith Alonso Nino Olivetto Peggy Justice Yan Li Presione cualquier teclaque salga ...

Cuando se ejecuta el programa anterior, vera todos los nombres de los estudiantes que se ingresaron previamente en la base de data.

Le recomendamos que ejecute el ejemplo anterior paso a paso para comprenderlo mejor.

Entity Framework - Enfoques DEV

En este capitulo, centremonos en crear modelos con Designer o Database First o simplemente usando Code First. A continuacion, se ofrecen algunos consejos que le ayudaran a decidir que flujo de trabajo de modelado elegir.

  • Ya hemos visto ejemplos de flujo de trabajo de modelado Code First, Database First y Model First.

  • Los flujos de trabajo Database First y Model First utilizaron Designer, pero uno comienza con la base de data para crear un modelo y el otro comienza en el modelo para crear un base de data .

Entity Framework - Guia rapida

  • Para desarrolladoresAquellos que no quieran usar Visual Designer mas la generacion de codigo, Entity Framework tiene un flujo de trabajo completamente diferente llamado Code First.

  • El flujo de trabajo tipico de Code First es ideal para aplicaciones nuevas en las que ni siquiera tiene una base de data. Usted define sus classs y codigo, luego deja que Code First determine como deberia verse su base de data.

  • Tambien es posible iniciar Code First con una base de data y esto hace que Code First sea un poco contradictorio. Pero hay una herramienta para realizar ingenieria inversa en una base de data en classs, lo cual es una excelente manera de comenzar con la codificacion.

Dadas estas opciones, veamos el arbol de decisiones.

  • Si prefiere trabajar con un disenador visual en el codigo generado, debera elegir uno de los flux de trabajo con EF Designer. Si su base de data ya existe, entonces Database First es su camino.

  • Si desea utilizar un disenador visual en un proyecto nuevo sin una base de data, querra utilizar Model First.

  • Si solo desea trabajar con codigo y no con un disenador, entonces Code First probablemente sea para usted con la opcion de usar la herramienta que retrocede la base de data a classs.

  • Si tiene classs existentes, lo mejor que puede hacer es usarlas con Code First.

Entity Framework - Operaciones de base de data

En los capitulos anteriores, aprendio tres formas diferentes de definir un modelo de data de entidad.

  • Dos de ellos, Database First y Model First, dependian del disenador de Entity Framework combinado con la generacion de codigo.

  • El tercero, Code First, le permite guardarUtilice un disenador visual y escriba su propio codigo.

  • Cualquiera que sea la ruta que elija, terminara con classs de dominio y una o mas classs de Entity Framework de DbContext le permitiran extraer y conservar los data relevantes para estos classs.

La API de DbContext en sus aplicaciones se utiliza como puente entre sus classs y su base de data. DbContext es una de las classs mas importantes de Entity Framework.

  • Le permite expresar y ejecutar consultas.

  • Toma los resultados de la consulta de la base de data y los convierte en instancias de nuestras classs modelo.

  • Puede realizar un seguimiento de los cambios de la entidad, incluida la adicion y eliminacion, luego activar la creacion de insercion, actualizacion y elimina que se envian a la base de data bajo demanda.

Verestas son las classs de contexto de publicidad de dominio en las que realizaremos varias operaciones en este capitulo. Este es el mismo ejemplo que creamos en el capitulo, Primer enfoque de la base de data.

Implementacion de la class de contexto

using System; utilizando System.Data.Entity; utilizando System.Data.Entity.Infrastruct ure; utilizando System.Data.Entity.Core.Objects; utilizando System.Linq; espacio de nombres DatabaseFirstDemo {UniContextEntities de class parcial publico: DbContext {UniContextEntities publico (): base ( "nombre = UniContextEntities ") {} anulacion protegida void OnModelCreating (DbModelBuilder modelBuention) {lanzar nuevo UnintalCodeFirstException } Cursos publicos virtuales de DbSet {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}}

Implementacion de classs de dominio

Clase por supuesto

espacio de nombres DatabaseFirstDemo {usando System; usando System.Collections.Generic; curso publico parcial de class {[System.Diagnostics.CodeAnalysis.SuppressMessage (" Microsoft.Usage ", " CA2214: DoNotCallOverridableMethodsInConstructors ")] curso publico () {this.Enrollments = new HashSet } public int CourseID {get; ensemble;} public string Title {get; ensemble;} public int Credits {get; ensemble;} [System.Diagnostics.CodeAnalysis. SuppressMessage ( "Microsoft.Usage ", "CA2227: CollectionPropertiesShouldBeReadOnly ")] public virtual ICollection Enrollments {get; ensemble;}}}

Clase de estudiante

espacio de nombres DatabaseFirstDemo {usando System; usando System.Collections.Generic; estudiante de class parcial publica {[System.Diagnostics.CodeAnalysis.SuppressMessage ( "Microsoft.Usage ", "CA2214: DoNotCallOverridableMethodsInConstructors ")] Public Student () {this.Enrollments = new HashSet } ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public System.DateTime EnrollmentDate {get; juntos; } [System.Diagnostics.CodeAnalysis.SuppressMessage ( "Microsoft.Usage ", "CA2227: CollectionPropertiesShouldBeReadOnly ")] public virtual ICollection Enrollments {get; juntos; }}}

Clase Inion

espacio de nombres DatabaseF irstDemo {using System; utilizando System.Collections.Generic; Inion de class parcial publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } public Nullable Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}}

Crear una operacion

Agregar un nuevo objeto con Entity Framework es tan facil como construir una nueva instancia de su objeto yRegistrelo usando el metodo Add en DbSet. El siguiente codigo le permite agregar un nuevo estudiante a la base de data.

class Program {static void Main (string args) {var newStudent = new Student // establece el nombre del estudiante newStudent.FirstMidName = "Bill newStudent.LastName = " Doors newStudent.EnrollmentDate = DateTime.Parse ( "21/10/2015 "); newStudent.ID = 100; // crea un objeto DBContext usando (var dbCtx = new UniContextEntities ()) {// Agrega un objeto Student en el DBset Students dbCtx.Students.Add (newStudent); // llamar al metodo SaveChanges para guardar al estudiante en la base de data dbCtx.SaveChanges }}}

Operacion de actualizacion

Cambiar los objetos existentes es tan facil como actualizar el valor asignado a las propiedades que desea cambiar y llamar a SaveChanges. Por ejemplo, el siguiente codigo se usa para cambiar el apellido de Ali de Khan en Aslam.

usando (var context = new UniContextEntities ()) {var student = (from d in context.Students donde d.FirstMidName == "Ali " seleccione d) .Single student.LastName = "Aslam context.SaveChanges }

Operacion de eliminacion

Para eliminar una entidad usando Entity Framework, usa el metodo Eliminar en DbSet. Eliminar trabajos de entidades existentes y recien agregadas. Llamar a Eliminar en una entidad que se ha agregado pero aun no esta registrada en la base de data cancelara la adicion de la entidad. La entidad se elimina del seguimiento de cambios y DbContext ya no la rastrea. Llamar a Eliminar en una entidad existente que esta siendo rastreada para cambios guardara la entidad para su eliminacion en la proxima llamada a SaveChanges El siguiente ejemplo es un codigo en el que el alumno se elimina de la base de data con el nombre Ali.

using (var context = new UniContextEntities ()) {var bay = (from d in context.Students donde d.FirstMidName == "Ali " select d) .Single contexto.Estudiantes.Eliminar (bahia); context.SaveChanges }

Operacion de lectura

Leer data existentes de la base de data es muy simple. Aqui esta el codigo en el que se recuperan todos los data de la tabla de Estudiantes, luego se mostrara un programa con el nombre y apellido de los estudiantes en orden alfabetico.

using (var db = new UniContextEntities ()) {var query = from b in db.Students orderby b.FirstMidName select b; Console.WriteLine ( "Todos Todos los estudiantes de la base de data: "); foreach (var elemento en solicitud) {Console.WriteLine (elemento.FirstMidName+" + elemento.LastName); } Console.WriteLine ( "Presione cualquier tecla para salir ... "); Console.ReadKey }

Entity Framework - Simultaneidad

Cualquier desarrollador de acceso a data tiene dificultades para responder a la pregunta sobre simultaneidad de data: "¿Que sucede si varias personas editan el mismo data al mismo tiempo ?? ”

  • Los mas afortunados de nosotros tratamos con reglas comerciales que dicen " no hay problema, el ultimo gana . "

  • En este caso, la competencia no es un problema. Lo mas probable es que no sea tan simple, y hay no es una formula magica para resolver cada escenario a la vez.

  • De forma predeterminada, Entity Framework tomara el camino del "ultimo en ganar", lo que significa que la ultima apuesta La actualizacion se aplica incluso si otra persona actualizo los data entre el momento en que se recuperaron y el momento en que se guardaron.

Tomemos un ejemplo para entenderlo mejor. El siguiente ejemplo agrega unLa nueva columna VersionNo en la tabla del curso.

Vaya al disenador y haga clic derecho en la ventana del disenador y seleccione la plantilla de base de data de actualizacion ...

 Entity Framework - Guia rapida

Vera que se agrega otra columna en la entidad del curso.

 Entity Framework - Guia rapida

Haga clic derecho en la columna recien creada VersionNo y seleccione Propiedades y cambie el modo de concurrencia a Fixed como se muestra en la siguiente imagen.

 Entity Framework - Guia rapida

Con el modo de competencia de Course.VersionNo configurado en Fixed, siempre que 'se actualiza un curso, el comando Actualizar buscara el curso usando su propiedad EntityKey y su propiedad VersionNo.

Echemos un vistazo a un escenario simple. Dos usuarios estan obteniendo el mismo cursoal mismo tiempo y el Usuario 1 cambia el titulo de este curso a Matematicas y guarda los cambios antes que el Usuario 2. Mas tarde, cuando el Usuario 2 cambia el titulo de este curso que fue obtenido antes de El usuario 1 guarda sus cambios, en este sentido el usuario 2 obtendra una excepcion de simultaneidad "Usuario2: se ha producido una excepcion de simultaneidad optimista .

using System; utilizando System.Data.Entity; utilizando System.Data.Entity.Infrastructure; utilizando System.Linq; espacio de nombres DatabaseFirstDemo {class Program {static void Main (string args) {Course c1 = null; Curso c2 = cero; // El usuario 1 obtiene el curso usando (var context = new UniContextEntities ()) {context.Configuration.ProxyCreationEnabled = false; c1 = context.Courses.Where (s ⇒ s.CourseID == 1) .Single } // El usuario 2 tambien obtiene el mismo curso usando (var context = new UniContextEntities ()) {context.Configuration.ProxyCreationEnabled = false; c2 = contexto.Curso.Donde (s ⇒ s.Curso ID == 1) .Single } // El usuario 1 actualiza el titulo del curso c1.Title = "Modificado de user1 // El usuario 2 actualiza el titulo del curso c2.Title = " Modificado from user2 // El usuario 1 primero guarda los cambios usando (var context = new UniContextEntities ()) {try {context.Entry (c1) .State = EntityState.Modified; context.SaveChanges } catch (DbUpdateConcurrencyException ex) {Console.WriteLine ( "Usuario1: Se ha producido una excepcion de simultaneidad optimista "); }} // El usuario 2 guarda los cambios despues del usuario 1. // El usuario 2 obtendra la ejecucion de concurrencia // porque CreateOrModifiedDate es diferente en la base de data usando (var context = new UniContextEntities ()) {try {context.Entry (c2) .State = EntityState.Modified; context.SaveChanges } captura (DbUpdateConcurrencyException ex) {Console.WriteLine ( "Usuario2: Se ha producido una excepcion de simultaneidad optimista "); }}}}}

Entity Framework - Transaccion

En todas las versiones de Entity Framework, siempre que ejecute SaveChanges () para insertar , actualice o elimine la base de data, el marco encapsulara esta operacion en una transaccion. Cuando llama a SaveChanges, el contexto inicia automaticamente una transaccion y la confirma o revierte dependiendo de si la persistencia fue exitosa.

  • Todo esto es transparente para ti y nunca tendras que preocuparte por ello.

  • Esta transaccion dura solo mientras se realiza la operacion y luego finaliza.

  • Cuando realiza otra operacion de este tipo, comienza una nueva transaccion.

Entity Framework 6 proporciona lo siguiente:

Database.BeginTransaction ()

  • C 'es una forma sencilla y mas facil en un DbContext existente de iniciar y finalizar transacciones para los usuarios.

  • Permite combinar varias operaciones en una misma transaccion y por lo tanto o todas son validadas, o todas son canceladas en una.

  • Esto tambien permite al usuario especificar mas facilmente el nivel de aislamiento de la transaccion.

Database.UseTransac cion ()

  • Permite que DbContext use un transaccion, que se inicio fuera de Entity Framework.

Echemos un vistazo al siguiente ejemplo donde se realizan multiples operaciones en una sola transaccion. El codigo es como -

class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {using (var dbContextTransaction = context .Database .BeginTransaction ()) {try {Student student = new Student () {ID =200, FirstMidName = "Ali ", LastName = "Khan ", EnrollmentDate = DateTime.Parse ( "2015-12-1 ")}; context.Students.Add (estudiante); context.Database.ExecuteSqlCommand (@ "UPDATE Course SET Title = 'Calculus ' "+"WHERE CourseID = 1045 "); var query = context.Courses.Where (c ⇒ c.CourseID == 1045); foreach (elemento var en solicitud) {Console.WriteLine (item.CourseID.ToString ()+" + item.Title+" + item.Credits); } context.SaveChanges var query1 = context.Students.Where (s ⇒ s.ID == 200); foreach (var item en query1) {Console.WriteLine (item.ID.ToString ()+" + item.FirstMidName+" + item.LastName); } dbContextTransaction.Commit } captura (excepcion) {dbContextTransaction.Rollback }}}}}

  • El inicio de una transaccion requiere que la conexion a la tienda subyacente este abierta.

  • Entonces, llamar a Database.BeginTransaction () abrira la conexion, si aun no esta abierta.

  • Si DbContextTransaction abrio la conexion, la cerrara cuando se llame a Dispose ().

Entity Framework - Vistas

Una vista es un objeto que contiene data obtenidos por una consulta predefinida. Una vista es un objeto virtual o una tabla cuyo conjunto de resultados se deriva de una consulta. Es muy similar a una tabla real porque contiene columnas y filas de data. Estos son algunos usos tipicos de las vistas:

  • Filtrar data de tablas subyacentes
  • Filtrar data por motivos de seguridad
  • Centralice los data distribuidos en varios servidores
  • Cree un conjunto de data reutilizable

Las vistas se pueden usar de la misma manera que usted puede usar mesas. Para usar la vista como una entidad, primero debe agregar vistas de base de data a EDM. Despues de agregar vistas a su modelo, puede trabajarir con el de la misma manera que las entidades normales, excepto para las operaciones de creacion, actualizacion y eliminacion.

Veamos como agregar vistas al modelo desde la base de data.

Paso 1 : cree un nuevo proyecto de aplicacion de consola.

 Entity Framework - Guia rapida

Paso 2 : haga clic derecho en el proyecto en el Explorador de soluciones y seleccione Agregar → Nuevo elemento.

Entity Framework - Guia rapida

Paso 3 : seleccione ADO.NET Entity Data Model en el panel central e ingrese el nombre ViewModel en el campo Nombre.

Paso 4 : haga clic en el boton Agregar que abrira el cuadro de dialogo del Asistente de modelo de data de entidad.

Paso 5 - Seleccione EF Designer de la base de data y haga clic en el boton Siguiente.

Paso 6 : seleccione la base de data existente y haga clic en Siguiente.

Entity Framework - Guia rapida

Paso 7 - Elija Entity Framework 6.xy haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 8 : seleccione las tablas y vistas de su base de data y haga clic en Finalizar.

Puede ver en la ventana del disenador que se crea una vista y puede usarla en el programa como una entidad .

En la solucion Explorer, puede ver que la class MyView tambien se genera desde la base de data.

Tomemos un ejemplo en el que todos los data se extraen de la vue. Aqui esta el codigo -

class Program {static void Main (string args) {using (var db = new UniContextEntities ()) {var query = from b in db .MyViews orderby b.FirstMidName seleccione b; Console.WriteLine ( "Todos los estudiantes en la base de data: "); foreach (elemento var en la consulta) {Console.WriteLine (item.FirstMidName+" + item.LastName);} Console.WriteLine ( "Presione cualquierth clave para salir ... "); Console.ReadKey }}}

Cuando se ejecuta el codigo anterior, recibira el siguiente resultado:

Todos los estudiantes en la base de data: Ali Khan Arturo final y Bill Gates Carson Alexander Gytis Barzdukas Laura Norman Meredith Alonso Nino Olivetto Peggy Justice Yan Li Presione cualquier tecla para salir ...

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

Entity Framework - Index

Un indice es un Estructura de data en disco basada en tablas y vistas. Los indices hacen que la recuperacion de data sea mas rapida y eficiente, en la mayoria de los casos. Sin embargo, sobrecargar una tabla o vista con indices podria afectar de manera desagradable el rendimiento de otras operaciones como inserciones o actualizaciones.

  • La indexacion es la nueva funcionCaracteristica del marco de la entidad en la que puede mejorar el rendimiento de su aplicacion Code First al reducir el tiempo necesario para consultar los data de la base de data.

  • Puede agregar indices a su base de data utilizando el Indexador y anular la configuracion predeterminada Único y Agrupados para obtener el indice que mejor se adapte a su situacion.

Echemos un vistazo al siguiente codigo donde se agrega el atributo Index en la class del curso para CourseID.

Curso de class publica parcial {Curso publico () {this.Enrollments = new HashSet } [Índice] public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } public byte VersionNo {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

La clave creada anteriormente no es unica, no esta agrupadaee. Hay sobrecargas disponibles para anular estos valores predeterminados:

  • Para convertir un indice en un indice agrupado, debe especificar IsClustered = true

  • De manera similar, tambien puede convertir un indice en un indice unico especificando IsUnique = true

mire el siguiente codigo C # donde un indice esta agrupado y es unico.

Curso de class publica parcial {Curso publico () {this.Enrollments = new HashSet } [Index (IsClustered = true, IsUnique = true)] public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } public byte VersionNo {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

El atributo de indice se puede utilizar para crear un indice unico en la base de data. Sin embargo, esto no significa que EF podra razonar sobre la singularidad de la columna.cuando se trata de relaciones, etc. Esta funcionalidad se conoce comunmente como compatibilidad con "restriccionesunicas".

Entity Framework - Procedimientos almacenados

Entity Framework le permite utilizar procedimientos almacenados en el modelo de data de entidad en lugar de, o en combinacion con, su generacion controles automaticos.

  • Puede usar procedimientos almacenados para realizar logica predefinida en tablas de bases de data, y muchas organizaciones tienen politicas establecidas que requieren el uso de estos procedimientos almacenados.

  • Tambien puede especificar que EF debe usar sus procedimientos almacenados para insertar, actualizar o eliminar entidades.

  • Si bien los comandos construidos dinamicamente son seguros, eficientes y, en general, tan buenos o mejores que los que puede escribir usted mismo, hay muchos casos en los que procLas ediciones almacenadas ya existen y las practicas de su empresa pueden restringir el uso directo de tablas.

  • Alternativamente, es posible que desee tener un control explicito sobre lo que se ejecuta en la tienda y prefiera crear procedimientos almacenados.

El siguiente ejemplo crea un nuevo proyecto desde Archivo → Nuevo → Proyecto.

 Entity Framework - Guia rapida

Paso 1 : seleccione el aplicacion de consola en el panel central e ingrese StoredProceduresDemo en el campo de nombre.

Paso 2 : en el Explorador de servidores, haga clic derecho en su base de data.

Paso 3 - Seleccione Nueva consulta e ingrese el siguiente codigo en T - Editor SQL para agregar una nueva tabla en su base de data.

SI NO EXISTE (SELECCIONE * FROM sys.objects DONDE object_id = OBJECT_ID (N '[dbo]. [StudentGrade] ') Y escriba (N 'U ')) COMENZAR CREAR TCAPAZ [dbo]. [StudentGrade] ([EnrollmentID] [int] IDENTITY (1,1) NOT NULL, [CourseID] [int] NOT NULL, [StudentID] [int] NOT NULL, [Grade] [decimal] (3, 2) NULL, CONSTRAINT [PK_StudentGrade] CLAVE PRINCIPAL CLÚSTER ([EnrollmentID] ASC) CON (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY] END GO

Paso 4 - Haga clic derecho en el editor y seleccione Ejecutar.

 Entity Framework - Guia rapida

Paso 5 : haz clic derecho en tu base de data y haga clic en Actualizar. Vera la tabla recien agregada en su base de data.

Paso 6 : en el Explorador de servidores, haga clic con el boton derecho nuevamente su base de data.

 Entity Framework - Guia rapida

Paso 7 : seleccione Nueva consulta e introduzcala siguiente codigo en el editor T-SQL para agregar un procedimiento almacenado a su base de data, que devolvera las calificaciones de los estudiantes.

SI NO EXISTE (SELECCIONAR * DE sys.objects DONDEobject_id = OBJECT_ID (N '[dbo]. [GetStudentGrades] ') Y escriba (N 'P ', N 'PC ')) BEGIN EXEC dbo.sp_executesql @statement = N 'CREATE PROCEDURE [dbo ]. [GetStudentGrades] @ StudentID int AS SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade WHERE StudentID = @StudentID 'END GO

Paso 8 - Haga clic derecho en editor y seleccione Ejecutar.

Paso 9 - Haga clic derecho en su base de data y haga clic en Actualizar. Vera que se crea un procedimiento almacenado en su base de data.

Paso 10 : haga clic derecho en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar → Nuevo elemento.

Paso 11 - Luego seleccione ADO.NET Entity Data Model en el panel de Plantillas.

Paso 12 - Ingrese SPModel como nombre, luego haga clic en Agregar.

Paso 13 - En el cuadro de dialogoElija el contenido de la plantilla, seleccione el disenador EF de la base de data y luego haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 14 : seleccione su base de data y haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 15 - En el cuadro de dialogo Choose your base objects data, haga clic en tablas, vistas.

Entity Framework - Guia rapida

Paso 16 : seleccione la funcion GetStudentGradesF oCourse ubicada debajo del nodo de Procedimientos y funciones almacenados y haga clic en Finalizar.

Paso 17 : seleccione Ver → Otras ventanas → Navegador de modelos de data de entidades y haga clic con el boton derecho en GetStudentGrades en Importaciones de caracteristicas y seleccione Editar.

Producira el siguiente cuadro de dialogo.

 Entity Framework - Guia rapida

Paso 18 : haga clic en el boton de opcion Entidades y seleccione StudentGrade de la lista desplegable como el tipo de retorno de este procedimiento almacenado y hace clic enz on Ok.

Echemos un vistazo al siguiente codigo C # en el que se obtendran todas las calificaciones pasando la ID del estudiante como parametro en el procedimiento almacenado GetStudentGrades.

class program {static void Main (string args) {using (var context = new UniContextEntities ()) {int StudentID = 22; var studentGrades = context.GetStudentGrades (estudianteID); foreach (var estudiante en studentGrades) {Console.WriteLine ( "ID del curso: {0}, Titulo: {1}, Grado: {2} ", student.CourseID, student.Course.Title, student.Grade); } Console.ReadKey }}}

Cuando se compile y ejecute el codigo anterior, recibira el siguiente resultado:

ID del curso: 4022, Titulo: Microeconomia, Grado: 3.00 ID del curso: 4041, Titulo: Macroeconomia, Grado: 3.50

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

Entity Framework - Entidades desconectadas

En este capitulo, veamos como realizar cambios en entidades que no van seguidas de un contexto. Las entidades que no van seguidas de un contexto se denominan entidades "desconectadas ".

  • Para la mayoria de las aplicaciones de un solo nivel, donde la interfaz de usuario y las capas de acceso a la base de data estan ejecutado en la misma aplicacion de proceso, probablemente solo realizara operaciones en entidades seguidas de un contexto.

  • Las operaciones en entidades desconectadas son mucho mas comunes en aplicaciones de N-Tier.

  • Las aplicaciones N-Tier implican recuperar data de un servidor y enviarlos de vuelta, a traves de la red, a una maquina cliente.

  • La aplicacion cliente manipula estos data antes de enviarlos de vuelta al servidor para que sean persistentes.

Estos son los dos pasos a seguir con un grafico de entidad decconectado o incluso un unico grafico de entidad desconectada.

  • Adjunte entidades a la nueva instancia de contexto e informe estas entidades al contexto.

  • Configure manualmente los EntityStates apropiados en estas entidades.

Echemos un vistazo mire el siguiente codigo en el que la entidad Student se agrega con dos entidades Enrollment.

class Program {static void Main (string args) {var student = new Student {ID = 1001, FirstMidName = "Wasim ", LastName = "Akram ", EnrollmentDate = DateTime.Parse ( "2015-10-10 "), Enrollments = new List {new EnrollmentID = 2001 , CourseID = 4022, StudentID = 1001}, nueva inscripcion {EnrollmentID = 2002, CourseID = 4025, StudentID = 1001},}}; usando (var context = new UniContextEntities ()) {context.Students.Add (estudiante); .WriteLine ( "Nuevo alumno ({0} {1}): {2} ", alumno.PrimeroMidNombre, alumno.LastNombre,context.Entry (estudiante) .State); foreach (inion var en student.Enrollments) {Console.WriteLine ( "ID de Inion: {0} Estado: {1} ", inion.EnrollmentID, context.Entry (inion) .State); } Console.WriteLine ( "Presione cualquier tecla para salir ... "); Console.ReadKey }}}

  • El codigo construye una nueva instancia de Estudiante, que tambien hace referencia a dos nuevas instancias de Enrollment en su propiedad Enrollments.

  • A continuacion, el nuevo alumno se agrega a un contexto usando el metodo Add.

  • Una vez agregado el alumno, el codigo utiliza el metodo DbContext.Entry para acceder a la informacion de seguimiento de cambios que Entity Framework tiene sobre el nuevo alumno.

  • A partir de esta informacion de seguimiento de cambios, la propiedad State se usa para escribir el estado actual de la entidad.

  • Este proceso luego se repite para cada una de las iniones nouvally creados que son referenciados por el nuevo estudiante. Si ejecuta la aplicacion, recibira el siguiente resultado:

Nuevo estudiante (Wasim Akram): ID de Inion agregado : 2001 Estado: ID de inion agregado: 2002 Estado: Agregado Presione cualquier tecla para salir ...

Mientras que DbSet.Add se usa para informar a Entity Framework sobre nuevas entidades , DbSet.Attach se usa para notificar a Entity Framework sobre entidades existentes. El metodo Attach marcara una entidad en el estado Sin cambios.

Echemos un vistazo al siguiente codigo C # en el que se adjunta una entidad desconectada con DbContext.

class Program {static void Main (string args) {var student = new Student {ID = 1001, FirstMidName = "Wasim ", LastName = "Akram ", EnrollmentDate = DateTime.Parse (" 2015-10-10 "), Enrollment = new List {New Enrollment {EnrollmentID = 2001, CourseID = 4022, StudentID = 1001}, nueva inscripcion {EnrollmentID = 2002, CourseID = 4025, StudentID = 1001},}}; using (var context = new UniContextEntities ()) {context.Students.Attach (estudiante); Console.WriteLine ( "Nuevo alumno ({0} {1}): {2} ", alumno.Primero nombreMedio, alumno.LastNombre, contexto.Entry (alumno) .Estado); foreach (inion var en student.Enrollments) {Console.WriteLine ( "ID de Inion: {0} Estado: {1} ", inion.EnrollmentID, context.Entry (inion) .State); } Console.WriteLine ( "Presione cualquier tecla para salir ... "); Console.ReadKey }}}

Cuando el codigo anterior se ejecuta con el metodo Attach (), recibira el siguiente resultado.

Estudiante nuevo (Wasim Akram): ID de Inion sin cambios: 2001 Estado: ID de Inion sin cambios: Estado 2002: Sin cambios Presione cualquier tecla para salir ...

Entity Framework - Funcion con valores de tabla

En este capitulo, aprendamos como asignar funciones avalor de tabla (TVF) usando Entity Framework Designer y como llamar a un TVF desde una consulta LINQ.

  • Actualmente, los TVF solo son compatibles con el flujo de trabajo Database First.

  • Se introdujo por primera vez en la version 5 de Entity Framework.

  • Para utilizar TVF, debe apuntar .NET Framework 4.5 o superior.

  • Esto es muy similar a los procedimientos almacenados pero con una diferencia clave, es decir, el resultado de un TVF es componible. Esto significa que los resultados de un TVF se pueden usar en una consulta LINQ, mientras que los resultados de un procedimiento almacenado no.

Echemos un vistazo al siguiente ejemplo de como crear un nuevo proyecto desde Archivo → Nuevo → Proyecto.

 Entity Framework - Guia rapida

Paso 1 - Seleccione la aplicacion de consola en el panel central e ingrese TableValuedFunctionDemo en el campo nosenor.

Paso 2 : en el Explorador de servidores, haga clic derecho en su base de data.

 Entity Framework - Guia rapida

Paso 3 : seleccione Nueva consulta e ingrese el siguiente codigo en el editor T-SQL para agregar una nueva tabla en su base de data.

SI NO EXISTE (SELECCIONE * FROM sys.objects DONDE object_id = OBJECT_ID (N '[dbo]. [StudentGrade] ') Y escriba (N 'U ')) COMIENCE A CREAR TABLA [dbo]. [StudentGrade] ([Enrollm entID] [int] IDENTITY (1,1) NOT NULL, [CourseID] [int] NOT NULL, [StudentID] [int] NOT NULL, [Grade] [decimal] (3, 2) NULL , CONSTRAINT [PK_StudentGrade] CLAVE PRINCIPAL CLÚSTER ([In rollmentID] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY] END GO

Paso 4 - Hacer haga clic derecho en el editor y seleccione Ejecutar.

Paso 5 - Haga clic derecho en su base de data y haga clic en Actualizar. Vera la tabla recien creadaagregado a su base de data.

 Entity Framework - Guia rapida

Paso 6 - Ahora crea una funcion que devolvera las calificaciones de los estudiantes para el curso. Ingresa el siguiente codigo en 'T-SQL editor.

CREAR FUNCIÓN [dbo]. [GetStudentGradesForCourse] (@CourseID INT) TABLA DE DEVOLUCIONES VOLVER SELECCIONAR [EnrollmentID], [CourseID], [StudentID] , [Grade] FROM [dbo]. [StudentGrade] WHERE CourseID = @CourseID

Paso 7 : haz clic con el boton derecho en el editor y selecciona Ejecutar.

 Guia rapida de Entity Framework

Ahora puede ver que la funcion esta creada.

Entity Framework - Guia rapida

Paso 8 : haga clic derecho en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar → Nuevo elemento.

Paso 9 : luego seleccione Modelo de data de entidad ADO.NET en el panel Plantillas.

 Entity Framework - Guia rapida

Paso 10 : ingrese TV FModel como nombre, luego haga clic en Agregar.

Paso 11 : en el cuadroElija el cuadro de dialogo Contenido del modelo, seleccione el disenador EF de la base de data y haga clic en Siguiente.

 Entity Framework - Guia rapida

Paso 12 : seleccione su base de data y haga clic en Siguiente.

Paso 13 - En el cuadro de dialogo Choose Your Database Objects, seleccione tablas, vistas.

Entity Framework - Guia rapida

Paso 14 : seleccione la funcion GetStudentGradesForCourse ubicada debajo del nodo Procedimientos y funciones almacenados y haga clic en Finalizar.

Paso 15 : seleccione Ver → Otras ventanas → Navegador de modelos de data de entidades y haga clic con el boton derecho en GetStudentGradesForCourse en Importaciones de funciones y seleccione Editar.

 Entity Framework - Guia rapida

Vera el siguiente dialogo.

 Entity Framework - Guia rapida

Paso 16 : haga clic en el boton de opcion Entidades y seleccione Inion en el cuadro combinado como el tipo de retorno de esta funcion y haga clic en Aceptar.

Echemos un vistazo 'mire el siguiente codigo C # en el que todosse recuperaran los estudiantes registrados para el curso ID = 4022 en la base de data.

class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {var CourseID = 4022; // Devuelve a los mejores estudiantes de la class de Microeconomia. var estudiantes = context.GetStudentGradesForCourse (CourseID); foreach (resultado var en Estudiantes) {Console.WriteLine ( "ID de estudiante: {0}, Grado: {1} ", result.StudentID, result.Grade); } Console.ReadKey }}}

Cuando se compila y ejecuta el codigo anterior, recibira el siguiente resultado:

Identificacion del estudiante: 1, Grado: 2 Identificacion del estudiante: 4, Grado: 4 Identificacion del estudiante: 9, Calificacion: 3.5

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

Entity Framework - Native SQL

En Entity Framework, puede realizar consultas con sus clausulas de entidad usando LINQ. Usted puede tambienEjecute consultas usando SQL sin procesar directamente en la base de data usando DbCOntext. Las tecnicas se pueden aplicar de la misma manera a los modelos creados con Code First y EF Designer.

Consulta SQL en una entidad existente

El metodo SqlQuery en DbSet le permite escribir una consulta SQL sin formato que devuelve instancias de entidad. Los objetos devueltos seran seguidos por el contexto como lo serian si fueran devueltos por una consulta LINQ. Por ejemplo:

class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {var Students = context.Students.SqlQuery ( "SELECCIONAR * DE dbo.Student "). Listar foreach (var estudiante en estudiantes) {string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1}, tFecha de inicio {2} ", Student.ID, nombre, estudiante.EnrollmentDate.ToString ()); } Console.ReadKey }}}

El codigoarriba recuperara a todos los estudiantes de la base de data.

Consulta SQL para tipos que no son de entidad

Se puede crear una consulta SQL que devuelva instancias de cualquier tipo, incluidos los tipos primitivos, utilizando el metodo SqlQuery en la class Base de data. Por ejemplo:

class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {var studentNames = context.Database.SqlQuery ( "SELECCIONAR FirstMidName DE dbo.Student "). Listar foreach (var estudiante en studentNames) {Console.WriteLine ( "Nombre: {0} ", estudiante); } Console.ReadKey }}}

comandos SQL a la base de data

El metodo ExecuteSqlCommnad se usa para enviar comandos que no son de consulta a la base de data, como el comando Insertar, Actualizar o Eliminar. Echemos un vistazo al siguiente codigo donde el nombre del estudiante se actualiza como ID = 1

class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {// Update command int noOfRowUpdate d = context.Database.ExecuteSqlCommand (" Update l 'conjunto de estudiantes FirstMidName = ' Ali 'donde ID = 1 "); context.SaveChanges var estudiante = context.Students.SqlQuery (" SELECT * FROM dbo.Student donde ID = 1 ") . Single string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1}, t Fecha de inicio {2} ", Student.ID, name, student.EnrollmentDate.ToString ()); Console.ReadKey }}}

El codigo anterior recuperara el nombre de todos los estudiantes en la base de data.

Entity Framework - Soporte de enumeracion

En Entity Framework, esta caracteristica le permitira definir una propiedad en una class de dominio que es un tipo de enumeracion y asignarla a una columna base de data de tipo entero. Entity Framework convertira el valor de bAse data hacia y desde la enumeracion adecuada a medida que consulta y guarda data.

  • Los tipos enumerados tienen todo tipo de ventajas cuando trabajan con propiedades que tienen un numero fijo de respuestas.

  • La seguridad y confiabilidad de una aplicacion aumentan cuando usa enumeraciones.

  • La enumeracion hace que sea mucho mas dificil para el usuario cometer errores, y los problemas como los ataques de inyeccion son inexistentes.

  • En Entity Framework, una enumeracion puede tener los siguientes tipos subyacentes:

    • Byte
    • Int16
    • Int32
    • Int64
    • SByte
  • El tipo debajo -el valor predeterminado para los elementos de enumeracion es int.

  • De forma predeterminada, el primer enumerador es 0 y el valor de cada enumerador es correctosif se incrementa en 1.

Echemos un vistazo al siguiente ejemplo donde crearemos una entidad como disenador y agregaremos algunas propiedades.

Paso 1 : cree un nuevo proyecto desde la opcion de menu Archivo → Nuevo → Proyecto.

Paso 2 : en el panel izquierdo, seleccione la aplicacion de consola.

 Entity Framework - Guia rapida

Paso 3 : ingrese EFEnumDemo como el nombre del proyecto y haga clic en Aceptar.

Paso 4 : haga clic derecho en el nombre del proyecto en el Explorador de soluciones y seleccione la opcion de menu Agregar → Nuevo elemento.

Paso 5 : seleccione la entidad Modelo de data ADO.NET en el panel Modelos.

Paso 6 - Ingrese EFEnumModel.edmx como nombre de archivo y haga clic en Agregar.

Paso 7 - En la pagina del Asistente de modelo de data de entidad, seleccione Modelo de disenador de EF vacio.

 Entity Framework - Guia rapida

Paso 8 : haga clic en Finalizarer

Paso 9 - Luego haga clic derecho en la ventana del disenador y seleccione Agregar → Entidad.

 Entity Framework - Guia rapida

El dial de la nueva entidad og box aparece como se muestra en la siguiente imagen.

 Entity Framework - Guia rapida

Paso 10 - Ingrese Departamento como el nombre de entidad y DeptID como el nombre de la propiedad, deje el tipo de propiedad Int32 y haga clic en Aceptar.

Paso 11 - Haga clic con el boton derecho en la entidad y seleccione Agregar nuevo → Propiedad escalar.

Entity Framework - Guia rapida

Paso 12 : cambie el nombre de la nueva propiedad a DeptName.

Paso 13 : cambie el tipo de la nueva propiedad a Int32 (de forma predeterminada, la nueva propiedad es de tipo String).

Paso 14 : para cambiar el tipo , abra la ventana Propiedades y cambie la propiedad Tipo a Int32.

Paso 15 - En Entity Framework Designer, haga clic con el boton derecho en el nombre de la propiedad erty, seleccione Convadvertir en enum.

 Entity Framework - Guia rapida

Paso 16 : en el cuadro de dialogo Agregar tipo de enumeracion, ingrese DepartmentNames para el nombre del tipo de enumeracion , cambie el tipo subyacente a Int32, luego agregue los siguientes miembros al tipo: Fisica, Quimica, Computacion y Economia.

 Entity Framework - Guia rapida

Paso 17 : haga clic en Aceptar.

Si cambia a la ventana del navegador del modelo, vera que el tipo tambien se agrego al nodo Tipos de enumeracion.

Entity Framework - Guia rapida

Generemos una base de data a partir del modelo siguiendo todos los pasos mencionados en el capitulo sobre el enfoque Model First.

Paso 1 : haga clic con el boton derecho en la superficie del Disenador de funciones y seleccione Generar base de data a partir del modelo.

El cuadro de dialogo Elija su conexion de data y aparecera el asistente de generacion de la base de data.

Paso 2 - Haga clic en el boton Nueva conexion.nosotros.

 Entity Framework - Guia rapida

Paso 3 : ingrese el nombre del servidor y EnumDemo para la base de data y haga clic en Aceptar.

Paso 4 : aparecera un cuadro de dialogo que le preguntara si desea crear una nueva base de data, haga clic en Si.

Paso 5 : haga clic en Siguiente y el Asistente para la creacion de bases de data genera un lenguaje de definicion de data (DDL) para crear una base de data. Ahora haga clic en Finalizar.

Paso 6 - Haga clic derecho en T-SQL Editor y seleccione Ejecutar.

Paso 7 - Para ver el esquema generado, haga clic con el boton derecho en el nombre de la base de data en el Explorador de objetos de SQL Server y seleccione Actualizar.

Vera la tabla Departamentos en la base de data.

Echemos un vistazo al siguiente ejemplo donde se agregan y guardan nuevos objetos de Departamento en el contexto. Y luego obtenga el departamento de TI.

class Program {static void Main (string args) {using (var context = new EFEnumModelContainer ()) {context.Departments. Add (new service {DeptName = DepartmentNames.Physics }); context.Departments.Add (nuevo departamento {DeptName = DepartmentNames.Computer}); context.Departments.Add (nuevo Departamento {DeptName = DepartmentNames.Chemistry}); context.Departments.Add (nuevo departamento {DeptName = DepartmentNames. Economia}); context.SaveChanges var departamento = (de d en contexto. Departamentos donde d.DeptName == DepartmentNames.Computer select d) .FirstOrDefault Console.WriteLine ( "ID de departamento: {0} , nombre del departamento: {1} ", department.DeptID, department.DeptName); Console.ReadKey }}}

Cuando se ejecuta el codigo anterior,recibira el siguiente resultado:

ID de servicio: 2, nombre de servicio: computadora

Le recomendamos que ejecute el ejemplo arriba paso a paso para una mejor comprension.

Entity Framework - Request hrone

Programming hrone implica realizar operaciones en segundo plano para que el hilo principal pueda continuar por si solo operaciones. De esta manera, el hilo principal puede mantener la interfaz de usuario receptiva mientras el hilo en segundo plano procesa la tarea actual.

  • Entity Framework 6.0 admite operaciones humanas para consultas y respaldo de data.

  • Las operaciones de Hrones pueden ayudar a su aplicacion de las siguientes maneras:

    • Haga que su aplicacion responda mejor a las interacciones de usuarios
    • Mejore el rendimiento general de su aplicacion
  • Puede realizar operaciones humanas de diferentes formas. Pero las palabras clave / await se introdujeron en .NET Framework 4.5, lo que facilita su trabajo.

  • Lo unico que debe seguir es el patron / await como se muestra en el siguiente fragmento de codigo.

Echemos un vistazo al siguiente ejemplo (sin usar / await) donde el metodo DatabaseOperations registra un nuevo estudiante en la base de data y luego busca a todos los estudiantes de la base de data y al final se imprime un mensaje adicional en la consola.

class Programa {static void Main (string args) {Console.WriteLine ( "Operaciones de base de data iniciadas "); DatabaseOperations Console.WriteLine Console.WriteLine ( "Operaciones de base de data completadas "); Console.WriteLine Console.WriteLine ( "Tutoriales de Entity Framework "); Console.ReadKey } Operaciones de base de data vacias estaticas publicas() {using (var context = new UniContextEntities ()) {// Cree un nuevo estudiante y guardelo context.Students.Add (new Student {FirstMidName = "Akram ", LastName = "Khan ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); Console.WriteLine ( "Llamando a SaveChanges. "); context.SaveChanges Console.WriteLine ( "SaveChanges completado. "); // Consulta para todos los estudiantes ordenados por nombre var estudiantes = (de s en el contexto. Orden de estudiantes por s.FirstMidName seleccione s) .ToList // Escribe todos los estudiantes en la consola Console.WriteLine Console.WriteLine ( "Todos los estudiantes: "); foreach (var estudiante en estudiantes) {string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( " + nombre); }}}}

Cuando se ejecuta el codigo anterior, recibira el siguiente resultado:

Llamando a SaveChanges. SaveChanges completado. Todos los estudiantes: Akram Khan Ali Khan AliAlexander Arturo Anand Bill Gates Gytis Barzdukas Laura Nornan Meredith fllonso Nino Olioetto Peggy Justice Yan Li Entity Framework Tutoriales

Usemos las noticias y esperemos las palabras clave y hagamos los siguientes cambios en Program.cs

  • Agregue el espacio de nombres System.Data.Entity que le dara los metodos de extension EF de hrone.

  • Agrega el espacio de nombres System.Threading.Tasks que nos permitira usar el tipo de tarea.

  • Actualice DatabaseOperations para marcar como hrone y devolver una Task .

  • Llame a la version Async de SaveChanges y espere a que se complete.

  • Llame a la version Async de ToList y espere el resultado.

class Programa {static void Main (string args) {var task = DatabaseOperations Console.WriteLine Console.WriteLine ( "Tutoriales de Entity Framework "); montonk.Espere Console.ReadKey } public static Task DatabaseOperations () {using (var context = new UniContextEntities ()) {// Cree un nuevo blog y guardelo context.Students.Add (new Student {FirstMidName = "Salman ", LastName = " Khan ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); Console.WriteLine ( "Llamando a SaveChanges. "); espere el contexto SaveChangesAsync Console.WriteLine ( "SaveChanges completado. "); // Solicitud para todos los estudiantes ordenados por nombre var estudiantes = esperar (de s en contexto. Orden de estudiantes por s.FirstMidName seleccione s) .ToListAsync // Escribe todos los estudiantes en la consola Console.WriteLine Console.WriteLine ( "Todos los estudiantes: "); foreach (var estudiante en estudiantes) {string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( " + nombre); }}}}

Cuando se ejecuta, producira el siguiente resultado.

Llamando a SaveChanges. DidactiSkies Entity Framework SaveChanges completado. Todos los estudiantes: Akram Khan Ali Khan Ali Alexander Arturo Anand Bill Gates Gytis Barzdukas Laura Nornan Meredith fllonso Nino Olioetto Peggy Justice Salman Khan Yan Li

Ahora que el codigo esta en sintonia, puede observar un flujo de ejecucion diferente de su programa.

  • SaveChanges comienza a enviar al nuevo estudiante a la base de data, luego el metodo DatabaseOperations regresa (aunque no haya terminado 'run) y el flujo del programa en el metodo Main continue.

  • Luego, el mensaje se escribe en la consola.

  • El hilo administrado se bloquea al llamar. Espere hasta que se complete la operacion de la base de data. Una vez completado, se ejecutaran el resto de las operaciones de nuestra base de data.

  • SaveChanges completado.

  • Obteniendo a todos los estudiantes de la base de data y se escribe en la consola.

Le recomendamos que ejecute el ejemplo anterior paso a paso para comprenderlo mejor.

Entity Framework - Persistencia

Entity Framework ahora le permite aprovechar Entity Framework sin forzar a cada parte de su aplicacion a conocer Entity Framework, separando las entidades de la infraestructura . Puede crear classs que se puedan centrar en sus reglas comerciales independientemente de su persistencia (donde se almacenan los data y como fluyen los data entre sus objetos).

Creacion de entidades ignorantes persistentes

El parrafo anterior describe un metodo que no tiene un conocimiento profundo de la source de los data que consume. Esto resalta la esencia de la ignorancia persistente, que es cuando a sus classs y a muchas de nuestras capas de aplicacion a su alrededor no les importa como los data se almacenan.

  • En la version .NET 3.5 de Entity Framework, si deseaba usar classs preexistentes, tenia que modificarlas forzandolas a derivar de EntityObject.

  • En .NET 4 esto ya no es necesario. No es necesario que modifique sus entidades para que puedan participar en las operaciones de Entity Framework.

  • Esto nos permite crear aplicaciones que adoptan un acoplamiento flexible y una separacion de preocupaciones.

  • Con estos modelos de codificacion, sus classs solo se preocupan por sus propias tareas y mis capas de su aplicacion, incluida la interfaz de usuario, no no dependen de la logica externa, como las API de Entity Framework, pero estas API externas pueden interactuar con nuestras entidades.

  • Hay 2 formas (conectadas y desconectadas) de mantener una entidad con Entity Framework. Ambos caminos tienen su propia importancia. En el caso de un escenarioconectado, los cambios son rastreados por el contexto, pero en el caso de un escenario desconectado, necesitamos informar al contexto sobre el estado de la entidad.

    Escenarios conectados

    El escenario conectado es cuando una entidad se extrae de la base de data y se modifica en el mismo contexto. Para un escenario conectado, digamos que tenemos un servicio de Windows y hacemos operaciones comerciales con esa entidad para que abramos el contexto, recorramos todas las entidades, realizamos nuestras operaciones comerciales y luego guardamos los cambios en el mismo contexto que abrimos. al principio.

    Echemos un vistazo al siguiente ejemplo donde los estudiantes se extraen de la base de data y actualizan los nombres de los estudiantes, luego guardemos los cambios en la base de data.

    class Program {static void Main (string args) {using (var context = new MyContext ()) {var studentList =context.Students.ToList foreach (var stdnt en studentList) {stdnt.FirstMidName = "Editado " + stdnt.FirstMidName; } context.SaveChanges //// Mostrar todos los estudiantes en la base de data var estudiantes = (de s en el contexto. Los estudiantes ordenan por s.FirstMidName seleccione s) .ToList Console.WriteLine ( "Obtener todos los estudiantes de la base de data: "); foreach (var stdnt en estudiantes) {string name = stdnt.FirstMidName+" + stdnt.LastName; Console.WriteLine ( "ID: {0}, nombre: {1} ", stdnt.ID, nombre); } Console.ReadKey }}}

    Cuando se compile y ejecute el codigo anterior, recibira el siguiente resultado y vera que la palabra editada se adjunta antes del nombre como se muestra en el siguiente resultado.

    Recuperar todos los estudiantes de la base de data: ID: 1, Nombre: Editado Editado Alain Bomer ID: 2, Nombre: Editado Editado Mark Upston

    Escenarios desconectados

    El escenario desconectado escuando una entidad se extrae de la base de data y se modifica en un contexto diferente. Supongamos que queremos mostrar data en una capa de presentacion y estamos usando una aplicacion de n niveles, por lo que seria mejor abrir el contexto, obtener los data y finalmente cerrar el contexto. Dado que aqui hemos recuperado los data y cerrado el contexto, las entidades que hemos recuperado ya no se rastrean y este es el escenario desconectado.

    Echemos un vistazo al siguiente codigo donde la nueva entidad Student desconectada se agrega a un contexto usando el metodo Add.

    class Program {static void Main (string args) {var student = new Student {ID = 1001, FirstMidName = "Wasim ", LastName = "Akram ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}; using (var context = new MyContext ()) {context.Students.Add (estudiante); context.SaveChanges //// Mostrar todo el veranoStudents var database Students = (de s en contexto. Los estudiantes ordenan por s.FirstMidName seleccione s) .ToList Console.WriteLine ( "Obtener todos los estudiantes de la base de data: "); foreach (var stdnt en estudiantes) {string name = stdnt.FirstMidName+" + stdnt.LastName; Console.WriteLine ( "ID: {0}, nombre: {1} ", stdnt.ID, nombre); } Console.ReadKey }}}

    Cuando se compile y ejecute el codigo anterior, recibira el siguiente resultado.

    Obtenga todos los estudiantes de la base de data: ID: 1, Nombre: Editado Editado Editado Alain Bomer ID: 2, Nombre: Editado Editado Editado Mark Upston ID: 3 , Nombre: Wasim Akram

    Entity Framework - Consultas de proyeccion

    LINQ to Entities

    Uno de los conceptos mas importantes para comprender LINQ to Entities es que es un lenguaje declarativo. El enfasis esta en definir que informacion necesita, en lugar de comopara conseguirlos.

    • Esto significa que puede dedicar mas tiempo a trabajar con data y menos a tratar de determinar el codigo subyacente necesario para realizar tareas como acceder a la base de data.

    • Es importante comprender que los lenguajes declarativos en realidad no eliminan ningun control del desarrollador, pero ayudan al desarrollador a concentrarse en lo que es importante.

    Palabras clave esenciales de LINQ to Entities

    Es importante conocer las palabras clave basicas que se utilizan para crear una consulta LINQ. Solo hay algunas palabras clave para recordar, pero puede combinarlas de diferentes formas para obtener resultados especificos. La siguiente lista contiene estas palabras clave basicas y proporciona una descripcion simple de cada una.

    Sr. No. Palabra clave y deion
    1

    Ascendente

    Especifica que una operacion de ordenacion se realiza desde el mas pequeno (o mas bajo) elemento de un rango al elemento mas alto de un rango. Esta es normalmente la configuracion predeterminada. Por ejemplo, al realizar una clasificacion alfabetica, la clasificacion estaria en el rango de la A a la Z.

    2

    Por

    Especifica el campo o expresion que se usa para implementar una agrupacion. El campo o expresion define una clave utilizada para realizar la tarea de agrupacion.

    3

    Descendente

    Especifica que una operacion la clasificacion se lleva a cabo desde el elemento mas grande (o mas alto) en un rango hasta el elemento mas bajo en un rango. Por ejemplo, al ordenar alfabeticamente, el orden estaria entre Z y A.

    4

    Igual que

    Se utiliza entre las clausulas izquierda y derecha de una declaracion de combinacion para unirse a la source de datadata contextuales primarios a la source de data contextuales secundaria. El campo o expresion a la izquierda de la palabra clave equals especifica la source de data primaria, mientras que el campo o expresion a la derecha de la palabra clave equals especifica la source de data secundaria.

    5

    De

    Especifica la source de data utilizada para obtener la informacion requerida y establece una variable de rango. Esta variable tiene el mismo proposito que una variable utilizada para la iteracion en un bucle.

    6

    Grupo

    Organice la salida en grupos en utilizando el valor clave que especifique. Utilice multiples clausulas de grupo para crear multiples niveles de organizacion de resultados. El orden de las clausulas de grupo determina la profundidad a la que aparece un valor de clave particular en el orden de agrupacion. Combina esta palabra clave con par para crear un contexto especifico.

    7

    En

    Se utiliza de varias formas. En este caso, la palabra clave determina la source de la base de data contextual utilizada para una consulta. Cuando se trabaja con una combinacion, la palabra clave in se utiliza para cada source de base de data sensible al contexto utilizada para la combinacion.

    8

    Into

    Especifica un identificador que puede utilicelo como referencia para las clausulas de consulta LINQ, como unirse, agrupar y seleccionar.

    9

    Unirse

    Crea una unica source de data de dos sources de data vinculadas, como en una instalacion principal o minorista. Una combinacion puede especificar una combinacion interna, de grupo o externa izquierda, con la combinacion interna predeterminada. Para obtener mas informacion sobre las combinaciones, consulte msdn. microsoft. com

    10

    Salir

    Define una variable de rango que puede utilizar para almacenar los resultados de subexpresion en una expresion de consulta. Por lo general, la variable de rango se usa para proporcionar resultados enumerados adicionales o para aumentar la eficiencia de una consulta (de modo que una tarea en particular, como encontrar el valor en minusculas de un cadena, no debe hacerse mas de una vez).

    11

    Habilitado

    Especifica el campo o expresion utilizado para implementar una combinacion. El campo o expresion define un elemento comun a ambas sources de data contextuales.

    12

    Orderby

    Crea un orden de clasificacion para la solicitud. Puede agregar una palabra clave ascendente o descendente para controlar el orden de clasificacion. Utilice varias clausulas orderby para crear varios niveles de clasificacion. El orden de las clausulas orderby determina el orden enque expresiones de ordenacion se manejan, por lo que usar un orden diferente dara como resultado una salida diferente.

    13

    Donde

    Define lo que LINQ debe extraer de la source de data. Utiliza una o mas expresiones booleanas para definir los detalles de los elementos a recuperar. Las expresiones booleanas se separan entre si mediante los simbolos && (AND) y ||. (OR) operadores.

    14

    Seleccionar

    Determina la salida de la solicitud LINQ especificando la informacion a devolver. Esta declaracion define el tipo de data de los elementos devueltos por LINQ durante el proceso de iteracion.

    Proyeccion

    Las solicitudes de proyeccion mejoran la eficiencia de su aplicacion, recuperando solo campos especificos de su base de data de data.

    • Una vez que tenga los data, querratal vez proyectarlos o filtrarlos segun sea necesario para dar forma a los data antes de la salida.

    • La tarea principal de cualquier expresion de LINQ to Entities es obtener data y proporcionarlos como salida.

    La seccion “Desarrollo de consultas de LINQ to Entities” de este capitulo muestra tecnicas para realizar esta tarea basica.

    Echemos un vistazo al siguiente codigo donde se obtendra la lista de estudiantes.

    using (var context = new UniContextEntities ()) {var studentList = from s in context. Los estudiantes seleccionan s; foreach (var estudiante en listaEstudiante) {nombre de cadena = estudiante.PrimeroNombreMedio+" + estudiante.LastNombre; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); }}

    Objeto unico

    Para recuperar un objeto de estudiante unico, puede utilizar los metodos enumerables First () o FirstOrDefault que devuelven el primer elemento de una secuencia. La diferencia entre FPrimero y FirstOrDefault es que First () lanzara una excepcion si no hay data de resultado para los criterios dados, mientras que FirstOrDefault () devuelve el valor nulo predeterminado, si hay sin data de resultados. En el fragmento de codigo a continuacion, se recuperara el primer estudiante de la lista cuyo nombre es Ali.

    usando (var context = new UniContextEntities ()) {var student = (from s in context.Students donde s.FirstMidName == "Ali " selecciona s) .FirstOrDefault string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); }

    Tambien puede utilizar Single () o SingleOrDefault para obtener un unico objeto de estudiante que devuelva un unico elemento especifico de una secuencia. En el siguiente ejemplo, se recupera un solo estudiante cuyo ID es 2.

    usando (var context = new UniContextEntities ()) {var student = (de s en contexto. Estudiantes donde s.ID == 2 selecciona s) .SingleOrDefault string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); Console.ReadKey }

    Lista de objetos

    Si desea recuperar la lista de estudiantes cuyo primer nombre es Ali, puede utilizar el metodo enumerable ToList ().

    usando (var context = new UniContextEntities ()) {var studentList = (from s in context.Students donde s.FirstMidName == "Ali " selecciona s) .Listar foreach (var estudiante en listaEstudiante) {nombre de cadena = estudiante.PrimeroNombreMedio+" + estudiante.LastNombre; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); } Console.ReadKey }

    Orden

    Para recuperar data / lista en un orden en particular, puede utilizar el orden de palabras clave. En el codigo loco, la lista de fragmentos de codigo de los estudiantes serarecuperados en orden ascendente.

    using (var context = new UniContextEntities ()) {var studentList = (from s in context.Students orderby s.FirstMidName ascendente select s) .ToList foreach (var estudiante en listaEstudiante) {nombre de cadena = estudiante.PrimeroNombreMedio+" + estudiante.LastNombre; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); } Console.ReadKey }

    Consulta estandar Vs Marco de entidad de proyeccion

    Suponga que tiene un modelo de estudiante que contiene ID, FirstMidName, LastName y EnrollmentDate. Si desea devolver una lista de estudiantes, una consulta estandar devolvera todos los campos. Pero si solo desea obtener una lista de estudiantes con los campos ID, FirstMidName y LastName. Aqui es donde necesita utilizar una consulta de proyeccion. A continuacion, se muestra un ejemplo sencillo de una consulta de proyeccion.

    usando (var context = new UniContextEntities ()) {var listaEstudiante = de s en contexto. Los estudiantes ordenan por s.FirstMidName ascendente donde s.FirstMidName == "Ali " seleccione nuevo {s.ID, s.FirstMidName, s.LastName}; foreach (var estudiante en listaEstudiante) {nombre de cadena = estudiante.PrimeroNombreMedio+" + estudiante.LastNombre; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); } Console.ReadKey }

    La consulta de proyeccion anterior excluye el campo EnrollmentDate. Hara que tu aplicacion sea mucho mas rapida.

    Entity Framework - Registro de pedidos

    En Entity Framework 6.0, se introduce una nueva funcionalidad, conocida como Logging SQL . Mientras trabaja con Entity Framework, envia comandos o consultas SQL equivalentes a la base de data para realizar operaciones CRUD (Crear, Leer, Actualizar y Eliminar).

    • Esta caracteristica de Entity Framework es capturar una consulta SQL equivalente generadapor Entity Framework internamente y proporcionarlo como salida.

    • Antes de Entity Framework 6, siempre que existia la necesidad de rastrear las consultas y los comandos de la base de data, el desarrollador no tenia que hacerlo 'No hay mas remedio que utilizar una utilidad de rastreo de terceros o una herramienta de rastreo de bases de data.

    • En Entity Framework 6, esta nueva funcionalidad proporciona una forma de registrar todas las operaciones realizadas por Entity Framework.

    • Toda la actividad realizada por Entity Framework se registra mediante DbContext.Database.Log.

    Echemos un vistazo al siguiente codigo donde se agrega un nuevo estudiante a la base de data.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {context.Database.Log = Console.Write; // Cree un nuevo alumno y guardelo context.Students.Add (newEstudiante {FirstMidName = "Salman ", LastName = "Khan ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); context.SaveChanges Console.ReadKey }}}

    Cuando se ejecuta el codigo anterior, recibira el siguiente resultado, que en realidad es el registro de todas las actividades realizadas por EF en el codigo anterior.

    Conexion abierta el 28/10/2015 6:27:35 PM +05: 00 Transaccion iniciada el 28/10/2015 18:27:35 PM +05: 00 INSERTAR [dbo]. [Estudiante] ([Apellido], [Primer nombre], [EnrollmentDate]) VALORES (@ 0, @ 1, @ 2) SELECCIONAR [ID] DE [dbo]. [Estudiante] DONDE @@ ROWCOUNT> 0 Y [ID] = scope_identity () - @ 0: 'Khan ' (Tipo = Cadena, Tamano = -1) - @ 1: 'Salman ' (Tipo = Cadena, Tamano = -1) - @ 2: '10 / 28/2015 12:00:00 AM '(Tipo = DateTime) - Se ejecuta el 28/10/2015 6:27:35 PM +05: 00 - Finalizado en 5 ms con el resultado: SqlDataReader Transaccion confirmada el 28/10/2015 6:27:35 PM +05: 00 Conexion cerrada el 28/10/2015 18:27:35 PM +05: 00

    Cuando se establece la propiedad Log, se registran las siguientes actividades:

    • SQL para todo tipo de comandos, por ejemplo, consultas, incluidas inserciones, actualizaciones y eliminaciones generadas como parte de SaveChanges

    • Parametros

    • Si el comando no se ejecuta o no, hrone

    • Una marca de tiempo que indica cuando comenzo a ejecutarse el comando

    • El comando se completo correctamente o fallo

    • Algunas sugerencias sobre el valor del resultado

    • El tiempo aproximado que tomo ejecutar el comando

    Conectarse a otro lugar

    Si ya tiene un marco de registro y define un metodo de registro, tambien puede conectarlo en otro lugar.

    Echemos un vistazo al siguiente ejemplo donde tenemos otra classMyLogger.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {context.Database.Log = s ⇒ MyLogger.Log ( "EFLoggingDemo ", s); // Cree un nuevo estudiante y guardelo context.Students.Add (new Student {FirstMidName = "Salman ", LastName = "Khan ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())} ); context.SaveChanges Console.ReadKey }}} public class MyLogger {Registro publico estatico vacio (aplicacion de cadena, mensaje de cadena) {Console.WriteLine ( "Aplicacion: {0}, Mensaje EF: {1} ", aplicacion, mensaje); }}

    Le recomendamos que ejecute el ejemplo anterior paso a paso para comprenderlo mejor.

    Entity Framework - Command Interception

    En Entity Framework 6.0, hay otra caracteristica nueva llamada Interceptor o Interception. El codigo de interceptacion se basa en el concepto de interfaces de interceptacion . Por ejemplo, la interfaz IDbCommandInterceptor define los metodos que se llaman antes de que EF llame a ExecuteNonQuery, ExecuteScalar, ExecuteReader y metodos asociados.

    • Entity Framework realmente puede brillar usando la intercepcion. Al utilizar este enfoque, puede capturar mucha mas informacion de manera transitoria sin tener que desorganizar su codigo.

    • Para implementar esto, necesita crear su propio interceptor personalizado y registrarlo en consecuencia.

    • Una vez que se ha creado una class que implementa la interfaz IDbCommandInterceptor, se puede registrar con Entity Framework usando la class DbInterception.

    • La interfaz IDbCommandInterceptor tiene seis metodos y necesita implementar todos estos metodos. Aqui esta la implementacion basica de estos metodos.

    Echemos un vistazoMire el siguiente codigo en el que se implementa la interfaz IDbCommandInterceptor.

    public class MyCommandInterceptor: IDbCommandInterceptor {Public static void Log (string comm, string message) {Console.WriteLine ( "Intercepted: {0}, Command Text: {1 } ", comm, mensaje); } public void NonQueryExecuted (comando DbCommand, DbCommandInterceptionContext interceptionContext) {Log ( "NonQueryExecuted: ", command.CommandText); } public void NonQueryExecuting (comando DbCommand, DbCommandInterceptionContext interceptionContext) {Log ( "NonQueryExecuting: ", command.CommandText); } public void ReaderExecuted (comando DbCommand, DbCommandInterceptionContext interceptionContext) {Log ( "ReaderExecuted: ", command.CommandText); } public void ReaderExecuting (comando DbCommand, DbCommandInterceptionContext interceptionContext) {Log ( "ReaderExecuting: ", command.CommandText); } public void ScalarExecuted (comando DbCommand, DbCommandInterceptionContext interceptionContext) {Log ( "ScalarExecuted: ", command.CommandText); } public void ScalarExecuting (comando DbCommand, DbCommandInterceptionContext interceptionContext) {Log ( "ScalarExecuting: ", command.CommandText); }}

    Registro de interceptores

    Una vez que se ha creado una class que implementa una o mas interfaces de interceptacion, se puede registrar con EF usando la class DbInterception como se muestra en el siguiente codigo.

    DbInterception.Add (new MyCommandInterceptor ());

    Los interceptores tambien se pueden registrar en el app-doma en el nivel utilizando la configuracion basada en el codigo DbConfiguration como se muestra en el siguiente codigo.

    public class MyDBConfiguration: DbConfiguration {public MyDBConfiguration () {DbInterception.Add (new MyCommandInterceptor ()); }}

    Tambien puede configurar el archivo de configuracion del interceptor usando el codigo -

    Entity Framework - Tipo de data espaciales

    El soporte de tipo espacial se introdujo en Entity Framework 5. A Tambien se incluye un conjunto de operadores para permitir que las consultas analicen data espaciales. Por ejemplo, una consulta puede filtrar en funcion de la distancia entre dos ubicaciones geograficas.

    • Entity Framework permitira exponer nuevos tipos de data espaciales como propiedades en sus classs y asignarlos a columnas espaciales en su base de data.

    • Tambien puede escribir consultas LINQ que utilicen operadores espaciales para filtrar, ordenar y agrupar en els calculos espaciales realizados en la base de data.

    Hay dos tipos principales de data espaciales:

    • El tipo de data geograficos almacena data elipsoidales, por ejemplo, coordenadas GPS de latitud y longitud.

    • El tipo de data de geometria representa el sistema de coordenadas euclidiano (plano).

    Echemos un vistazo al siguiente ejemplo de Cricket Ground.

    Paso 1 : cree un nuevo proyecto desde la opcion de menu Archivo → Nuevo → Proyecto.

    Paso 2 : en el panel izquierdo, seleccione la aplicacion de consola.

     Guia rapida de Entity Framework

    Paso 3 : haz clic derecho en el nombre del proyecto y seleccione Administrar paquetes NuGet…

     Entity Framework - Guia quick

    Paso 4 : Instale Entity Framework.

    Paso 5 : agregue una referencia a el ensamblado System.Data.Entity y tambien agregue System.Data.Spatial usando el instruccion para tipos de data espaciales.

     Entity Framework - Guia rapida

    Paso 6 - Agrega la siguiente class al archivo Program.cs.

    public class CricketGround {public int ID {get; juntos; } nombre de cadena publica {get; juntos; } Ubicacion publica de DbGeography {get; juntos; }}

    Paso 7 : ademas de definir entidades, debe definir una class que se derive de DbContext y exponga las propiedades de DbSet .

    En Program.cs, agregue la definicion de contexto.

    class publica parcial CricketGroundContext: DbContext {public DbSet CricketGrounds {get; juntos; }}

    Paso 8 : agrega el siguiente codigo en la funcion Main, que agregara dos nuevos objetos CricketGround al contexto.

    class Program {static void Main (string args) {using (var context = new CricketGroundContext ()) {context.CricketGrounds.Add (new CricketGround () {Nombre = "Shalimar Cricket Ground ", Ubicacion = DbGeography.FromText ( "POINT (-122.336106 47.605049) "),}); context.CricketGrounds.Add (nuevo CricketGround () {Nombre = "Estadio Marghazar ", Ubicacion = DbGeography .FromText ( "POINT (-122.335197 47.646711) "),}); context.SaveChanges var myLocation = DbGeography.FromText ( "PUNTO (-122.296623 47.640405) "); var cricketGround = (de cg en context.CricketGrounds orderby cg.Location.Distance (myLocation) select cg) .FirstOrDefault Console.WriteLine ( "El campo de cricket mas cercano a ti es: {0}. ", CricketGround.Name); }}}

    Las propiedades espaciales se inicializan utilizando el metodo DbGeography.FromText. El punto geografico representado por WellKnownText se pasa al metodo y luego guarda los data. Detras de este objeto CricketGround se recogera donde su ubicacion sea mas cercana a la ubicacion especificada.

    Cuando el codigo anterior esejecutado, recibira el siguiente resultado:

    El campo de cricket mas cercano a usted es el estadio Marghazar

    Le recomendamos que corra el ejemplo anterior paso a paso para una mejor comprension.

    Entity Framework - Herencia

    La herencia le permite crear modelos complejos que reflejan mejor la forma en que piensan los desarrolladores y tambien reduce el trabajo requerido para interactuar con esos modelos. La herencia usada con entidades tiene el mismo proposito que la herencia usada con classs, por lo que los desarrolladores ya conocen los conceptos basicos de como funciona esta caracteristica.

    Echemos un vistazo al siguiente ejemplo y creemos un nuevo proyecto de aplicacion de consola.

    Paso 1 : agregue el modelo de data de entidad ADO.NET haciendo clic derecho en el nombre del proyecto y seleccione Agregar → Nuevo elemento ...

    Paso 2 : agregue una entidad ynConviertase en su Persona siguiendo todos los pasos mencionados en el capitulo Modelo Primer Enfoque.

    Paso 3 : agregue propiedades escalares como se muestra en la siguiente imagen.

    Entity Framework - Guia rapida

    Paso 4 : agregaremos dos entidades mas Estudiante y Profesor , que heredara propiedades de Person Table.

    Paso 5 - Ahora agregue una entidad Estudiante y seleccione Persona en la lista desplegable Tipo de base como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Paso 6 - Del mismo modo, agregue un profesor de entidad.

    Paso 7 : ahora agregue la propiedad escalar EnrollmentDate a la entidad Student y la propiedad HireDate a la entidad Teacher.

    Paso 8 - Vamos a generar la base de data.

    Paso 9 : haga clic con el boton derecho en la superficie de diseno y seleccione Generar base de data a partir del modelo ...

     Entity Framework - Guia rapida

    Étape 10 - Para crear una nueva base de data, haga clic en Nueva conexion ... Se abrira el siguiente cuadro de dialogo. Haga clic en Aceptar.

     Entity Framework - Guia rapida

    Paso 11 : haga clic en Finalizar. Esto agregara el archivo * .edmx.sql al proyecto. Puede ejecutar DDL en Visual Studio abriendo el archivo .sql . Ahora haga clic derecho y seleccione Ejecutar.

    Paso 12 - Vaya al explorador del servidor, vera que la base de data se crea con tres tablas que se especifican.

     Entity Framework - Guia rapida

    Paso 13 : tambien puede ver que las classs los nombres de dominio tambien se generan automaticamente.

    public parcial class Person {public int ID {get; set;} public string FirstMidName {get; set;} public string LastName { get; ensemble;}} publico class parcial Estudiante: Persona {publico System.DateTime EnrollmentDate {get; ensemble;}} class porMaestro publico tial: Persona {Public System.DateTime HireDate {get; juntos; }}

    Esta es la class de contexto.

    public parcial class InheritanceModelContainer: DbContext {public InheritanceModelContainer (): base ( "name = InheritanceModelContainer ") {} anulacion protegida void OnModelCreating (DbModelBuilder) {modelo nuevo UnintentionalCodeFirstException } Publico virtual dbSet People {get; juntos; }}

    Agreguemos algunos estudiantes y profesores a la base de data y luego los obtengamos de la base de data.

    class Program {static void Main (string args) {using (var context = new InheritanceModelContainer ()) {var student = new Student {FirstMidName = "Meredith " , LastName = "Alonso ", EnrollmentDate = DateTime.Parse (DateTime.Today. ToString ())}; context.People.Add (estudiante); var estudiante1 = nuevo estudiante {FirstMidName = "Arturo ", LastName = "Anand ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}; context.People.Add (student1); var techaer = new teacher {FirstMidName = " Peggy ", LastName = " Justice " , HireDate = DateTime.Parse (DateTime.Today.ToString ())}; context.People.Add (techaer); var techaer1 = nuevo profesor {FirstMidName = "Yan ", LastName = "Li ", HireDate = DateTime.Parse (DateTime.Today.ToString ())}; context.People.Add (techaer1); context.SaveChanges }}}

    Los estudiantes y profesores se agregan a la base de data Para recuperar a los alumnos y al profesor, se debe utilizar el metodo OfType , que devolvera al alumno y al profesor vinculados al departamento especificado.

    Console. WriteLine ( "Todos los estudiantes en la base de data "); Console.WriteLine ( "); foreach (var estudiante en contexto.People.OfType ()) {string name = student .FirstMidName+" + estudiante.LastName; Console.WriteLine ( "ID:{0}, Nombre: {1}, fecha de inicio {2} ", Student.ID, nombre, estudiante.EnrollmentDate.ToString ());} Console.WriteLine (" "); Console.WriteLine ( "******************************************** * *************** ***** "); Console.WriteLine (" "); Console.WriteLine (" Todos los profesores en la base de data " ); Console.WriteLine ( "); foreach (var teacher in context.People.OfType ()) {string name = teacher.FirstMidName+" + teacher.LastName; Console.WriteLine ( "ID: {0}, nombre: {1}, tHireDate {2} ", teacher.ID, nombre, teacher.HireDate.ToString ());} Console.WriteLine ( "); Console.WriteLine ( "******************************************** ** ************** ***** "); Console.ReadKey

    En la primera consulta, cuando se usa OfType () , no podra acceder a HireDate porque la propiedad HireDate es parte de Teacher Entity y, de manera similar, la propiedad EnrollmentDate no sera accesible cuando use OfType ()

    Cuando se ejecuta el codigo anterior, recibira el siguiente resultado:

    Todos los estudiantes en la base de data ID: 1, nombre: Meredith Alonso, fecha de inicio 30/10/2015 00:00:00 ID: 2, nombre: Arturo Anand, fecha de inicio 30/10/2015 00:00:00 *********** *************************** *********************** ****** Todos los maestros en la base de data ID: 3, Nombre: Peggy Justice, HireDate 10/30/2015 12: 00:00 AM ID: 4, Nombre: Yan Li, HireDate 10/30/2015 00:00:00 ************************* ********************* ********************

    Le recomendamos que ejecute el ejemplo anterior paso a paso para mejorar comprension.

    Entity Framework - Migracion

    En Entity Framework 5 y versiones anteriores de Entity Framework, el codigo estaba

     Entity Framework - Guia rapida

    En Entity Framework 6, las API principales que anteriormente formaban parte del marco .NET tambien se envian y distribuyen como parte del paquete NuGet.

     Entity Framework - Guia rapida

    Esto era necesario para permitir que Entity Framework se hiciera de codigo abierto; sin embargo, como resultado, las aplicaciones deberan reconstruirse siempre que sea necesario migrar o actualizar su aplicacion desde versiones anteriores de Entity. Framework a EF 6.

    El proceso de migracion es sencillo si su aplicacion usa DbContext, que se envio en EF 4.1 y posterior, pero si su aplicacion es ObjectContext, entonces se requiere poco trabajo.

    Echemos un vistazo a los siguientes pasos que debe seguir para actualizar una aplicacion existente a EF6.

    Paso 1 -El primer paso es apuntar a .NET Framework 4.5.2 y versiones posteriores, haga clic derecho en su proyecto y seleccione propiedades.

     Entity Framework - Guia rapida

    Paso 2 : vuelva a hacer clic con el boton derecho en su proyecto y seleccione Administrar paquetes NuGet. ..

    Paso 3 : en la pestana En linea, seleccione EntityFramework y haga clic en Instalar. Asegurese de que se hayan eliminado las referencias de ensamblado a System.Data.Entity.dll.

    Cuando instale el paquete EF6 NuGet, deberia eliminar automaticamente todas las referencias a System.Data.Entity de su proyecto.

    Paso 4 - Si tiene un modelo creado con EF Designer, tambien necesitara actualizar los modelos de generacion de codigo para generar codigo compatible con EF6.

    Paso 5 - En su Explorador de soluciones en su edmx, elimine las plantillas de generacion de codigo existentes que se generaranNormalmente se denomina .tt y .Context.tt.

     Entity Framework - Guia rapida

    Paso 6 : abre tu modelo en EF Designer, haga clic con el boton derecho en la superficie de diseno y seleccione Agregar elemento de generacion de codigo ...

    Paso 7 : agregue el EF apropiado Modelo de generacion de codigo 6.x.

     Entity Framework - Guia rapida

    Tambien generara automaticamente codigo compatible con EF6.

    Si sus aplicaciones usan EF 4.1 o posterior, no necesitara para cambiar algo en el codigo, porque los espacios de nombres de los tipos DbContext y Code First no han cambiado.

    Pero si su aplicacion esta usando una version antigua de Entity Framework, luego, tipos como ObjectContext que estaban anteriormente en System.Data.Entity.dll se han movido a nuevos espacios de nombres.

    Paso 8 : necesitara actualizar sus directivas using o Import para compilar con EF6.

    La regla generaleral para los cambios de espacio de nombres es que cualquier tipo en System.Data. * se mueve a System.Data.Entity.Core. *. Éstos son algunos de ellos:

    • System.Data.EntityException ⇒ System.Data .Entity.Core. EntityException
    • System.Data.Objects.ObjectContext ⇒ System.Data .Entity.Core. Objects.ObjectContext;
    • System.Data.Objects.DataClasses.RelationshipManager ⇒ System.Data .Entity.Core. Objects.DataClasses.RelationshipManager;

    Algunos tipos estan en los espacios de nombres Core porque no se utilizan directamente para la mayoria de las aplicaciones basadas en DbContext.

    • System.Data.EntityState ⇒ System.Data.Entity.EntityState
    • System.Data.Objects.DataClasses. EdmFunctionAttribute ⇒ System.Data.Entity.DbFunctionAttribute

    Su proyecto existente de Entity Framework funcionara en Entity Framework 6.0 sin modificaciones importantes.

    Entity Framework - Carga ansiosa

    La carga ansiosa es el proceso mediante el cual una consulta para un tipo de entidad tambien carga entidades relacionadas como parte de la consulta. La carga anticipada se logra mediante el metodo Incluir .

    Esto significa que la solicitud de data asociada debe devolverse con los resultados de la consulta de la base de data. Solo se realiza una conexion a la source de data, se devuelven mas data en la solicitud inicial.

    Por ejemplo, cuando pregunte a los estudiantes, cargue ansiosamente sus inions. Los estudiantes y sus iniones se recuperaran en una sola solicitud.

    Echemos un vistazo al siguiente ejemplo donde todos los estudiantes con sus respectivas iniones se extraen de la base de data mediante una carga rapida.

    class Programa {static void Main (string args) {using (var context = new UniContextEntities ()) {// Cargar todos los estudiantes y las iniones asociadas var estudiantes = context.Students .Include (s ⇒ s.Enrollments) .ToList foreach (var estudiante en estudiantes) {string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); foreach (inion var en student.Enrollments) {Console.WriteLine ( "ID de Inion: {0}, ID del curso: {1} ", inion.EnrollmentID, inion.CourseID); }} Console.ReadKey }}}

    Cuando se compile y ejecute el codigo anterior, recibira el siguiente resultado.

    ID: 1, Nombre: Ali Alexander ID de Inion: 1, ID de curso: 1050 ID de Inion: 2, ID de curso: 4022 ID ID de Inion: 3, ID de curso: 4041 ID: 2, Nombre: Meredith Alonso ID de Inion: 4, ID de curso: 1045 ID de Inion: 5, ID de curso: 3141 inion: 6, ID del curso: 2021 ID: 3, Nombre: Arturo Anand ID del Inion: 7, ID del curso: 1050 ID: 4, Nombre: Gytis Barzdukas ID del Inion: 8, ID de curso: 1050 ID de Inion: 9, ID de curso: 4022

    Estas son algunas de las otras formas de solicitudes de carga ansiosas que se pueden utilizar.

    // Cargar un alumno y sus iniones asociadas var student1 = context.Students .Where (s ⇒ s.FirstMidName == "Ali ") .Include (s ⇒ inscripciones) .FirstOrDefault // Cargue todos los Estudiantes y las iniones asociadas // usando una cadena para especificar la relacion var studentList = context.Students .Include ( "Inions "). Listar // Cargue un estudiante y sus iniones asociadas // usando una cadena para especificar la relacion var estudiante = contexto. Estudiantes. Donde (s ⇒ s.PrimerMidName == "Salman ") .Include ( "Enrollments ") . FirstOrDefault

    Varios niveles

    Tambien es posible cargar rapidamente varios niveles de entidades relacionadas. Las siguientes consultas muestran ejemplos de estudiantes, iniones y cursos.

    // Cargar todos los estudiantes, las relaciones y los cursos asociados var studentList = context.Students .Include (s ⇒ s.Inrollments.Select (c ⇒ c.Course)). ToList / / Cargar todos los estudiantes, todas las iniones asociadas y todos los cursos asociados // usando una cadena para especificar las relaciones var Students = context.Students .Include ( "Enrollments.Course "). ToList

    Recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

    Entity Framework - Lazy Load

    Lazy Load es el proceso por el cual una entidad o coleccion de entidades se carga automaticamente desde la base de data la primera vez que se accede a una propiedad que hace referencia a la entidad / entidades. La carga diferida significa retrasar la carga de data relacionados , hasta que lo solicite especificamente.

    • Al usarTipos de entidad POCO, la carga diferida se logra creando instancias de los tipos de proxy derivados y luego anulando las propiedades virtuales para agregar el gancho de carga.

    • La carga diferida es practicamente la predeterminada.

    • Si deja la configuracion predeterminada y no le dice explicitamente a Entity Framework en su consulta que desea algo mas que la carga diferida, entonces la carga diferida es lo que desea. obtendra.

    • Por ejemplo, cuando se usa la class de entidad Student, los inions asociados se cargaran la primera vez que se acceda a la propiedad de navegacion de Inions.

    • La propiedad de navegacion debe establecerse como publica, virtual. El contexto NO se cargara de forma diferida si la propiedad no esta configurada como virtual.

    Aqui hay una class para estudiantes que contiene la propiedad de navegacion de Enrollments.

    publico class parcial Estudiante {publico Estudiante () {esto.Enrollments = new HashSet } ID public int {get; set;} public string LastName {get; set;} public string FirstMidName { get; ensemble;} public System.DateTime EnrollmentDate {get; ensemble;} Public virtual inions ICollection {get; ensemble;}}

    Echemos un vistazo a un ejemplo simple en el que la lista de estudiantes se carga primero desde la base de data, luego cargara las iniones de un estudiante especifico cuando las necesite.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {// Cargar solo estudiantes IList Students = context.Students.ToList foreach (var estudiante en estudiantes) {string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); foreach (inion var en student.Enrollments) {Console.WriteLine (" ID de Inion: {0}, ID del curso: {1 } ", inion.EnrollmentID, inion.CourseID);}} Console.ReadKey }}}

    Cuando se compile y ejecute el codigo anterior, recibira el siguiente resultado.

    ID: 1, Nombre: Ali Alexander ID de Inion: 1, ID de curso: 1050 ID de Inion: 2, ID de curso: 4022 ID de Inion: 3, ID de curso: 4041 ID: 2, Nombre: Meredith Alonso ID de Inion: 4, ID de curso: 1045 ID de Inion: 5, ID de curso: 3141 ID de Inion: 6, ID ID del curso: ID 2021: 3, Nombre: Arturo Anand ID Inion: 7, ID del curso: 1050 ID: 4, Nombre: Gytis Barzdukas ID Inion: 8, ID del curso: 1050 ID del curso inion: 9, ID de curso: 4022 ID: 5, Nombre: Yan Li ID de Inion: 10, ID de curso: 4041 ID: 6, Nombre: Peggy Justice ID de Inion: 11, ID de curso: 1045 ID: 7, nombre: Laura Norman ID de Inion: 12, ID de curso: 3141

    Deshabilitar la carga diferida

    Carga diferida yla serializacion no se mezcla, y si no tiene cuidado, puede terminar consultando toda su base de data. porque la carga diferida esta habilitada. Se recomienda deshabilitar la carga diferida antes de serializar una entidad.

    Deshabilitar propiedades de navegacion especificas

    La carga diferida de la coleccion de Inscripciones se puede inhabilitar configurando la propiedad Inscripciones no virtuales como se muestra en el siguiente ejemplo.

    estudiante de class publica parcial {Estudiante publico () {this.Enrollments = new HashSet } ID int publico {get; set;} cadena publica LastName {get; set;} cadena publica FirstMidName {get; set;} public System.DateTime EnrollmentDate {get; set;} public ICollection Enrollments {get; set;}}

    Desactivar para todas las entidades

    La carga diferida se puede desactivar para todas las entidades en el contexto estableciendo una banderade la propiedad Configuration a false como se muestra en el siguiente ejemplo.

    public parcial class UniContextEntities: DbContext {public UniContextEntities (): base ( "name = UniContextEntities ") {this.Configuration.LazyLoadingEnabled = false;} anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {throw new UnintentionalCodeFirstException }}

    Despues de desactivar la carga diferida, ahora, cuando vuelva a ejecutar el ejemplo anterior, vera que los iniones no estan cargados y y se recuperan los data del estudiante.

    ID: 1, Nombre: Ali Alexander ID: 2, Nombre: Meredith Alons ID: 3, Nombre: Arturo Anand ID: 4, Nombre: Gytis Barzduka ID: 5 , Nombre: Yan Li ID: 6, Nombre: Peggy Justice ID: 7, Nombre: Laura Norman ID: 8, Nombre: Nino Olivetto

    Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

    Entity Framework - Cargarment explicitamente

    Cuando ha desactivado la carga diferida, todavia es posible cargar entidades asociadas de forma diferida, pero debe hacerse con una llamada explicita.

    • A diferencia de la carga diferida, no hay ambiguedad ni posibilidad de confusion con respecto a cuando se ejecuta una consulta.

    • Para hacer esto, use el metodo Load en la entrada de la entidad asociada.

    • Para una relacion de uno a varios, llame al metodo Load en Collection.

    • Y para una relacion uno a uno, llame al metodo Load en Reference.

    Echemos un vistazo al siguiente ejemplo donde la carga diferida esta deshabilitada y luego se busca al estudiante cuyo primer nombre es Ali.

    La informacion del estudiante se escribe luego en la consola. Si observa el codigo, la informacion de inion tambien esta escrita, pero la entidad de Inions aun no esta cargada.por lo que el bucle foreach no se ejecutara.

    Despues de que la entidad Inions se cargue explicitamente, ahora la informacion del estudiante y las inions se escribiran en la ventana de la consola.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {context.Configuration.LazyLoadingEnabled = false; var estudiante = (de s en contexto. Estudiantes donde s.FirstMidName == "Ali " selecciona s) .FirstOrDefault string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); foreach (inion var en student.Enrollments) {Console.WriteLine ( "ID de Inion: {0}, ID del curso: {1} ", inion.EnrollmentID, inion.CourseID); } Console.WriteLine Console.WriteLine ( "Inions cargados explicitamente "); Console.WriteLine contexto.Entry (estudiante) .Coleccion (s ⇒ s.Enrollments) .Load Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); foreach (inion var en student.Enrollments) {Console.WriteLine (" ID de Inion: {0}, ID del curso: {1} ", inion.EnrollmentID, inion.CourseID);} Console.ReadKey }}}

    Cuando se ejecuta el ejemplo anterior, recibira el siguiente resultado. Primero, solo la informacion sobre el 'student se muestran y despues de la carga explicita de la entidad inion, se muestra la informacion sobre el estudiante y sus inions asociados.

    ID : 1, Nombre: Ali Alexander ID de inion cargado explicitamente: 1, nombre: Ali Alexander ID de Inion: 1, ID de curso: 1050 ID de Inion: 2, ID de curso: 4022 Id d 'inion: 3, ID del curso: 4041

    Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

    Entity Framework - Validacion

    En este capitulo, aprendamos sobre las tecnicas de validacion que se pueden usar en ADO.NET Entity Framework para validar dataes del modelo. Entity Framework proporciona una amplia variedad de funciones de validacion que se pueden implementar en una interfaz de usuario para la validacion del lado del cliente o se pueden utilizar para la validacion del lado del servidor.

    • En Entity Framework, la validacion de data es parte de la solucion para detectar data incorrectos en una aplicacion.

    • Entity Framework valida todos los data antes de que se escriban en la base de data predeterminada, utilizando una amplia variedad de metodos de validacion de data.

    • Sin embargo, Entity Framework viene despues de la validacion de data de la interfaz de usuario. Entonces, en este caso, es necesario que la validacion de la entidad maneje todas las excepciones lanzadas por EF y muestre un mensaje generico.

    • Existen algunas tecnicas de validacion de data para mejorar la verificacion de errores y como devolverr mensajes de error para el usuario.

    DbContext tiene un metodo Overridable llamado ValidateEntity. Cuando llame a SaveChanges, Entity Framework llamara a este metodo para cada entidad en su cache cuyo estado no ha cambiado. Puede colocar la logica de validacion directamente aqui, como se muestra en el siguiente ejemplo para la entidad estudiante.

    class publica parcial UniContextEntities: DbContext {anulacion protegida System.Data.Entity.Validation .DbEntityValidationResult ValidateEntity (DbEntityEntry entityEntry, System.Collections.Generic.IDictionary ( "FirstMidName ") == ") {var list= new List list.Add (nuevo System.Data.Entity.Validation .DbValidationError ( "FirstMidName ", "FirstMidName es obligatorio ")); devolver nuevo System.Data.Entity.Validation .DbEntityValidationResult (entityEntry, lista); }} if (entityEntry.CurrentValues.GetValue ( "Apellido ") == ") {lista de var = nueva Lista list.Add (nuevo System.Data.Entity.Validation .DbValidationError ( "LastName ", "LastName is required ")); devolver nuevo System.Data.Entity.Validation .DbEntityValidationResult (entityEntry, lista); } return base.ValidateEntity (entityEntry, elementos); }}

    En el metodo ValidateEntity anterior, las propiedades FirstMidName y LastName de la entidad Student se verifican si alguna de estas propiedades tiene una cadena vacia, luego devolvera un mensaje de 'culpa.

    Tomemos un ejemplo simple en el que se crea un nuevo estudiante, pero el FirstMidName del estudiante es una cadena vacia como se muestra en el siguiente codigo.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {Contrasole.WriteLine ( "Anadiendo un nuevo estudiante a la base de data "); Console.WriteLine prueba {context.Students.Add (new Student () {FirstMidName = ", LastName = "Upston "}); context.SaveChanges } catch (DbEntityValidationException dbValidationEx) {foreach (DbEntityValidationResult entityErr en dbValidationEx.EntityValidationErrors) {foreach (DbValidationError en entityErr.ValidationErrors) {Console.Write ErrorLine (} }}}

    Cuando el ejemplo anterior se compila y ejecuta, recibira el siguiente mensaje de error en la ventana de la consola.

    Agregar un nuevo alumno a la base de data Error: FirstMidName es obligatorio

    Le recomendamos que ejecute el ejemplo anterior paso a paso para mejorar comprension.

    Entity Framework - Seguimiento de cambios

    Entity Framework le permite realizar un seguimiento de los cambiosa las entidades y sus relaciones, de modo que se realicen las actualizaciones correctas en la base de data cuando se llame al metodo SaveChanges de contexto. Esta es una caracteristica clave de Entity Framework.

    • Change tracking rastrea cambios mientras agrega nuevos registros a la coleccion de caracteristicas, modificando o eliminando caracteristicas existentes.

    • Luego, todos los cambios se guardan en el nivel DbContext.

    • Estos cambios de seguimiento se pierden si no se guardan antes de destruir el objeto DbContext.

    • La class DbChangeTracker le brinda toda la informacion sobre las entidades actuales seguida del contexto.

    • Para rastrear una entidad por contexto, debe tener la propiedad de clave principal.

    En Entity Framework, el seguimiento de cambios esta habilitado de forma predeterminada. Tu poTambien puede desactivar el seguimiento de cambios estableciendo la propiedad AutoDetectChangesEnabled de DbContext en false. Si esta propiedad se establece en true, Entity Framework mantiene el estado de las entidades.

    using (var context = new UniContextEntities ()) {context.Configuration.AutoDetectChangesEnabled = true; }

    Echemos un vistazo al siguiente ejemplo donde los estudiantes y sus iniones se extraen de la base de data.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {context.Configuration.AutoDetectChangesEnabled = true; Console.WriteLine ( "Consiga un estudiante "); var estudiante = (de s en contexto. Estudiantes donde s.FirstMidName == "Ali " selecciona s) .FirstOrDefault string name = student.FirstMidName+" + student.LastName; Console.WriteLine ( "ID: {0}, Nombre: {1} ", Student.ID, nombre); Console.WriteLine Console.WriteLine ( "Obtener todas las iniones asociadas "); foreach (inion var en student.Enrollments) {Console.WriteLine ( "ID de Inion: {0}, ID del curso: {1} ", inion.EnrollmentID, inion.CourseID); } Console.WriteLine Console.WriteLine ( "Seguimiento de cambios de contexto de {0} entidad. ", Context.ChangeTracker.Entries (). Count ()); entradas var = context.ChangeTracker.Entries foreach (entrada de var en las entradas) {Console.WriteLine ( "Nombre de la entidad: {0} ", entrada.Entidad.GetType (). Nombre); Console.WriteLine ( "Status: {0} ", entry.State);} Console.ReadKey }}}

    Cuando se compila y ejecuta el ejemplo anterior, recibira el siguiente resultado.

    Obtener ID de estudiante: 1, Nombre: Ali Alexander Obtener todos los inions asociados ID de Inion: 1, ID de curso: ID de Inion 1050 : 2, ID de curso: 4022 ID de Inion: 3, ID de curso: 4041 Seguimiento de cambios de contexto para la entidad 4. Nombre de la entidad: EstadoNumero de estudiante: Sin cambios Nombre de la entidad: Inion Estado: Sin cambios Nombre de la entidad: Inion Estado: Sin cambios Nombre de la entidad: Inion Estado: Sin cambios

    Puede ver que todos los data solo se toman de la base de data, por eso el estado no cambia para todas las entidades.

    Ahora echemos un vistazo a otro ejemplo simple en el que agregaremos un inion adicional y eliminaremos un alumno de la base de data. Aqui esta el codigo en el que se agrega un nuevo inion y se elimina un alumno.

    class Program {static void Main (string args) {using (var context = new UniContextEntities ()) {context.Configuration.AutoDetectChangesEnabled = true; Inion enr = new inion () {StudentID = 1, CourseID = 3141}; Console.WriteLine ( "Anadiendo un nuevo inion "); context.Enrollments.Add (enr); Console.WriteLine ( "Eliminar estudiante "); var estudiante = (de s en contexto.Estudiantes donde s.ID == 23 seleccione s) .SingleOrDefault context.Students.Remove (estudiante); Console.WriteLine ( "); Console.WriteLine ( "Seguimiento de cambios de contexto de {0} entidad. ", Context.ChangeTracker.Entries (). Count ()); entradas var = context.ChangeTracker.Entries foreach (entrada var en las entradas) {Console.WriteLine ( "Nombre de la entidad: {0} ", entrada.Entidad.GetType (). Nombre); Console.WriteLine ( "Estado: {0} ", entrada.State); } Console.ReadKey }}}

    Cuando se compila y ejecuta el ejemplo anterior, recibira el siguiente resultado.

    Adicion de un nuevo inion Elimina los cambios de seguimiento del contexto del estudiante de 2 entidades. Nombre de la entidad: Inion Estado: Anadido Nombre de la entidad: Estado del alumno: Eliminado

    Ahora puede ver el estado de la entidad del alumno. 'inion se establece como agregado y el estado de la entidad del estudiante se elimina porque se agrego un nuevo iniony un alumno se elimina de la base de data.

    Le recomendamos que ejecute el ejemplo anterior paso a paso para comprenderlo mejor.

    Entity Framework - Entity Entities

    En Entity Framework, Colored Entity se trata principalmente de cambiar el color de la entidad en el disenador para que sea facil para los desarrolladores Identifique los grupos de entidades asociados en el disenador de Visual Studio. Esta funcionalidad se introdujo por primera vez en Entity Framework 5.0.

    • Esta caracteristica no tiene nada que ver con aspectos de rendimiento.

    • Cuando tiene un proyecto a gran escala y muchas entidades en un archivo edmx, esta caracteristica es muy util para separar sus entidades en diferentes modulos.

    Si esta trabajando con el archivo edmx y lo ha abierto en el disenador, para cambiar el color, seleccionez una entidad en las ventanas de diseno. Luego haga clic derecho y seleccione Propiedades.

     Entity Framework - Guia rapida

     Entity Framework - Guia rapida

    En la ventana Propiedades, seleccione la propiedad Color de relleno.

     Entity Framework - Guia rapida

    Especifique el color usando un nombre de color valido, por ejemplo , Verde o un RGB valido (255, 128, 128) o tambien puede seleccionar el selector de color.

    Entity Framework - Guia rapida

    Para cambiar el color de varias entidades a la vez, seleccione varias entidades y cambie el Color de relleno para todas usando la ventana de propiedades.

    Entity Framework - Guia rapida

    Tambien puede cambiar el formato de las propiedades seleccionando una de las siguientes opciones:

    • Nombre para mostrar
    • Nombre y tipo para mostrar

    De forma predeterminada, la opcion de nombre para mostrar esta seleccionada Para cambiar el formato de la propiedad, haga clic derechola ventana del disenador.

     Entity Framework - Guia rapida

    Seleccione Formato de propiedad escalar → Nombre y tipo para mostrar.

     Entity Framework - Guia rapida

    Ahora puede ver que el tipo tambien se muestra con el nombre.

    Entity Framework - Code First Approach

    Entity Framework ofrece tres enfoques para crear un modelo de entidad, cada uno con sus ventajas y desventajas.

    • Codifique primero
    • Primero la base de data
    • El modelo primero

    En este capitulo describiremos brevemente el enfoque del codigo primero. Algunos desarrolladores prefieren trabajar con el Disenador en Codigo mientras otros simplemente prefieren trabajar con su codigo. Para estos desarrolladores, Entity Framework tiene un flujo de trabajo de modelado llamado Code First.

    • El modelado de Code First apunta a una base de data que no existe y Code First la creara.

    • Se puede editar.tambien se puede usar si tiene una base de data vacia, entonces Code First le agregara nuevas tablas.

    • Code First le permite definir su modelo usando classs C # o VB.Net.

    • La configuracion adicional se puede hacer opcionalmente usando atributos en sus classs y propiedades o usando una API sin problemas.

    ¿Por que Code First?

    • Code First en realidad se compone de un conjunto de piezas de rompecabezas. Primero, sus classs de dominio.

    • Las classs de dominio no tienen nada que ver con Entity Framework. Estos son solo los elementos de su area de negocio.

    • Entity Framework, por lo tanto, tiene un contexto que administra la interaccion entre estas classs y su base de data.

    • El contexto no es especifico de Code First. Es una caracteristica de Entity Framework.

    • Code First agrega una geGenerador de modelos que inspecciona sus classs basadas en contexto, luego usa un conjunto de reglas o convenciones para determinar como esas classs y relaciones describen un modelo y como ese modelo debe mapearse en su base de data.

    • Todo esto sucede en tiempo de ejecucion. Nunca veras este modelo, solo esta en la memoria.

    • Code First tambien tiene la opcion de usar esta plantilla para crear una base de data si lo desea.

    • Tambien puede actualizar la base de data si el modelo cambia, usando una funcion llamada Code First Migrations.

    Configuracion del entorno

    Para comenzar a utilizar el enfoque EF Code First, necesita instalar las siguientes herramientas en su sistema.

    • Visual Studio 2013 (.net framework 4.5.2) o posterior.
    • MS SQL Server 2012 o posterior.
    • Entity Framework a traves del paquete NuGet.

    Instale EF a traves del paquete NuGet

    Paso 1 : primero, cree la aplicacion de consola desde Archivo → Nuevo → Proyecto…

    Paso 2 : seleccione Windows en el panel izquierdo y la aplicacion Consola en el panel de plantillas.

     Entity Framework - Guia rapida

    Paso 3 : ingrese EFCodeFirstDemo como nombre y seleccione Aceptar.

    Paso 4 : haga clic con el boton derecho en su proyecto en el explorador de soluciones y seleccione Administrar paquetes NuGet…

     Entity Framework - Guia rapida

    Esto abrira NuGet Package Manager y buscara EntityFramework. Esto buscara todos los paquetes relacionados con Entity Framework .

    Paso 5 : seleccione EntityFramework y haga clic en Instalar. O en el menu Herramientas, haga clic en NuGet Package Manager, luego en Package Manager Console. En la ventana Package Manager Console, ingrese el siguiente comando: Install- Package EntityFramework.

     Entity Framework - Guia rapida

    LorCuando se complete la instalacion, vera el siguiente mensaje en la ventana de salida "Instalacion exitosa de 'EntityFramework 6.1.2 ' en EFCodeFirstDemo".

    Despues de la instalacion, EntityFramework.dll se incluira en su proyecto, como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Ahora estas listo para comenzar a trabajar en el enfoque Code First.

    Entity Framework - Example First

    Definamos un modelo muy simple usando classs. Simplemente las definimos en el archivo Program.cs, pero en una aplicacion real

     Entity Framework - Guia rapida

    Crear plantilla

    Agregue las siguientes tres classs al archivo Program.cs usando el siguiente codigo para la class Student.

    class publica Estudiante {publico intID {obtener; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    • La propiedad ID se convertira en la columna de clave principal de la tabla de la base de data que corresponde a esta class.

    • La propiedad Enrollments es una propiedad de navegacion. Las propiedades de navegacion contienen otras entidades relacionadas con esta entidad.

    • En este caso, la propiedad Enrollments de una entidad Student contendra todas las entidades Enrollment asociadas con esa entidad Student.

    • Las propiedades de navegacion generalmente se configuran como virtuales para aprovechar ciertas caracteristicas de Entity Framework, como la carga diferida.

    • Si una propiedad de navegacion puede contener varias entidades (como en varias relacionesa muchos o uno a muchos), su tipo debe ser una lista en la que se puedan agregar, eliminar y actualizar entradas, como ICollection.

    Aqui esta la implementacion de la class del curso.

    curso de class publica {public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    La propiedad Inscripciones es una propiedad de navegacion. Una entidad del curso se puede asociar con cualquier numero de entidades inion.

    Aqui esta la implementacion de la class inion y la enumeracion.

    public enum Grade {A, B, C, D, F} Public class Inion {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {obtener; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntosmi; } Estudiante estudiante virtual publico {get; juntos; }}

    • La propiedad EnrollmentID sera la clave principal.

    • La propiedad Grade es una enumeracion. El signo de interrogacion despues de la declaracion de tipo de calificacion indica que la propiedad de calificacion es anulable.

    • Una calificacion cero es diferente de una calificacion cero. Nulo significa que no se conoce una calificacion o aun no se ha asignado.

    • Las propiedades StudentID y CourseID son claves foraneas, y las propiedades de navegacion correspondientes son Student y Course.

    • Una entidad de inscripcion esta asociada con una entidad de estudiante y curso, por lo que la propiedad solo puede contener una entidad de estudiante y curso.

    Crear contexto de base de data

    La class principal que coordina la funcionalidad de Entity Framework para un modelo de data dado es la class de contexto de base de data que le permite consultar ypara guardar data. Puede crear esta class derivando de la class DbContext y exponiendo un DbSet escrito para cada class en nuestro modelo. Aqui esta la implementacion en la class MyContext, que se deriva de la class DbContext.

    public class MyContext: DbContext {Cursos de DbSet virtuales publicos {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Aqui esta el codigo completo para el archivo Program.cs.

    usando System.ComponentModel.DataAnnotations.Schema; utilizando System.Data.Entity; utilizando System.Linq; usando System.Text; usando System.Threading.Tasks; espacio de nombres EFCodeFirstDemo {class Program {static void Main (string args) {}} public enum Grade {A, B, C, D, F} public class Enrollment {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntosmaiz; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} Estudiante de class publica {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }} public class MyContext: DbContext {DbSet virtual public Course {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}}

    El codigo anterior es todo lo que necesitamos para comenzar a almacenar y recuperar data. Agreguemos algunos data y luego los recuperemos. aquie codigo del metodo principal.

    static void Main (string args) {using (var context = new MyContext ()) {// Cree y guarde una nueva Consola de estudiante. WriteLine ( "Add Nuevos estudiantes "); var student = new Student {FirstMidName = "Alain ", LastName = "Bomer ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}; context.Students.Add (estudiante); var estudiante1 = nuevo estudiante {FirstMidName = "Mark ", LastName = "Upston ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}; context.Students.Add (estudiante1); context.SaveChanges // muestra todos los estudiantes en la base de data var estudiantes = (de s en contexto. Los estudiantes ordenan por s.FirstMidName seleccione s) .ToList Console.WriteLine ( "Obtener todos los estudiantes de la base de data: "); foreach (var stdnt en estudiantes) {string name = stdnt.FirstMidName+" + stdnt.LastName; Console.WriteLine ( "ID: {0}, nombre: {1} ", stdnt.ID, name);} Console.WriteLine (" Presione cualquier tecla para salir ... "); Console.ReadKey }}

    Cuando se ejecuta el codigo anterior, recibira el siguiente resultado.

    Agregar nuevos estudiantes Recuperar todos los estudiantes de la base de data: ID: 1, Nombre: Alain Bomer ID: 2, Nombre: Mark Upston Presione cualquier tecla para salir ...

    Ahora la pregunta que me viene a la mente es, ¿donde estan los data y la base de data donde agregamos algunos data y luego los extraemos de la base de data. Por convencion, DbContext ha creado una base de data para usted.

    • Si una instancia local de SQL Express esta disponible, Code First creo la base de data en esa instancia.

    • Si SQL Express no esta disponible, Code First intentara usar LocalDb.

    • La base de data ase lleva el nombre deEl nombre completo del contexto derivado.

    En nuestro caso, la instancia de SQL Express esta disponible y el nombre de la base de data es EFCodeFirstDemo.MyContext como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    • Estas son solo las convenciones predeterminadas y Hay varias formas de modificar la base de data utilizada por Code First.

    • Como puede ver en la imagen de arriba, ha creado tablas de estudiantes, Cursos e Inions y cada tabla contiene columnas con el tipo de data y la longitud adecuados.

    • Los nombres de las columnas y el tipo de data tambien coinciden con las propiedades de las classs de dominio respectivo.

    Inicializando la base de data

    En el ejemplo anterior, hemos visto que Code First crea una base de data automaticamente, pero si desea cambiar el nombre de la base de data y el servidor, veamos como Code First decide el nombrebase de data y servidor al inicializar una base de data. Mira el siguiente diagrama.

     Entity Framework - Guia rapida

    Puede definir el constructor base de la class de contexto de la siguiente manera.

    • Sin parametros
    • Nombre de la base de data data
    • Nombre de la cadena de conexion

    Sin parametros

    Si especifica el constructor base de la class de contexto sin ningun parametro, como se muestra en el ejemplo anterior, el marco de la entidad creara una base de data en su servidor SQLEXPRESS local con un nombre {Espacio de nombres}. {Nombre de class de contexto}.

    En el Ejemplo anterior, la base de data que se crea automaticamente tiene el nombre EFCodeFirstDemo .MyContext. Si observa el nombre, encontrara que EFCodeFirstDemo es el espacio de nombres y MyContext es el nombre de la class de contexto como se muestra el siguiente codigo.

    public class MyCont ext: DbContext {public MyContext (): base () {} public virtual DbSet Course {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Nombre de la base de data

    Si pasa el nombre de la base de data como un parametro en un constructor base de la class de contexto, entonces Code First volvera a crear automaticamente una base de data, pero esta vez el nombre sera el que se paso como parametro en el constructor base en el servidor de base de data local SQLEXPRESS.

    En el siguiente codigo, MyContextDB se especifica como parametro en el constructor base. Si ejecuta su aplicacion, la base de data con el nombre MyContextDB se creara en su servidor SQL local.

    public class MyContext: DbContext {public MyContext (): base ( "MyContextDB ") {} Cursos publicos virtuales de DbSet {get; miparece; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Nombre de la cadena de conexion

    Esta es una manera facil de decirle a DbContext que use un servidor de base de data que no sea SQL Express o LocalDb. Puede optar por poner una cadena de conexion en su archivo app.config.

    • Si el nombre de la cadena de conexion coincide con el nombre de su contexto (con o sin calificacion de espacio de nombres), entonces sera encontrado por DbContext cuando se use el parametro constructor menos.

    • Si el nombre de la cadena de conexion es diferente del nombre de su contexto, entonces puede decirle a DbContext que use esta conexion en el modo Code First pasando el nombre de la cadena de conexion al constructor DbContext.

    public class MyContext: DbContext {public MyContext (): base ( "nombre= MyContextDB ") {} Curso Virtual DbSet public {get; ensemble;} Inions Virtual DbSet public {get; ensemble;} public virtual DbSet Students {get; ensemble;}}

    • En el codigo anterior, se especifica un fragmento de la cadena de conexion de la class de contexto como parametro en el constructor base.

      >
    • El nombre de la cadena de conexion debe comenzar con "nombre = ", de lo contrario lo considerara como un nombre de base de data.

    • Este formulario indica explicitamente que espera que la cadena de conexion se encuentre en su archivo de configuracion. Se lanzara una excepcion si no se encuentra una cadena de conexion con el nombre dado.

      >

    • El nombre de la base de data en la cadena de conexion en app.config es EFMyContextDB . CodeFirst creara una nueva base de data EFMyContextDB o utilizara la base de data EFMyContextDB existente en SQL Server local.

    Clases de dominio

    Hasta ahora, acabamos de dejar a EF descubriendo el modelo usando sus convenciones predeterminadas, pero hay habra ocasiones en las que nuestras classs no sigan las convenciones y necesitemos poder hacer alguna configuracion adicional. Pero puede anular estas convenciones configurando sus classs de dominio para proporcionar a EF la informacion que necesita. Existen dos opciones para configurar sus classs de dominio:

    • Anotaciones de data
    • API Fluent

    Anotaciones de data

    Las anotaciones de data se utilizan para configurar sus classs que resaltarandencia las configuraciones mas comunmente necesarias. Las anotaciones de data tambien son entendidas por una serie de aplicaciones .NET, como ASP.NET MVC, que permiten que estas aplicaciones aprovechen las mismas anotaciones para las validaciones del lado del cliente.

    Aqui estan las anotaciones de data que se utilizan en la class de los estudiantes.

    Public class Enrollment {[Key] public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } publ IC Grade? Grade {get; juntos; } [ForeignKey ( "CourseID ")] Curso virtual publico Curso {get; juntos; } [ForeignKey ( "ID ")] Estudiante estudiante publico virtual {get; juntos; }}

    API fluida

    La mayoria de las configuraciones del modelo se pueden realizar utilizando anotaciones de data simples. La API Fluent es una forma avanzada de especificar la configuracion del modelo que cubre todo, desde pequenas anotaciones de datawind, ademas de una configuracion mas avanzada que no es posible con anotaciones de data. Las anotaciones de data y la API fluida se pueden usar juntas.

    Para acceder a la API fluida, anula el metodo OnModelCreating en DbContext. Ahora cambiemos el nombre de la columna en la tabla Student de FirstMidName a FirstName como se muestra en el siguiente codigo.

    public class MyContext: DbContext {anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {modelBuilder.Entity () .Property (s ⇒ s.FirstMidName) .HasColumnName ( "Nombre de pila "); } Cursos publicos virtuales de DbSet {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Entity Framework - Anotaciones de data

    DataAnnotations se usa para configurar las classs que resaltaran las configuraciones mas comunest necesario. Varias aplicaciones .NET tambien entienden las anotaciones de data, como ASP.NET MVC, que permite que estas aplicaciones aprovechen las mismas anotaciones para las validaciones del lado del cliente. Los atributos DataAnnotation anulan las convenciones predeterminadas de CodeFirst.

    System.ComponentModel.DataAnnotations incluye los siguientes atributos que tienen un impacto en la nulidad o el tamano de la columna.

    • Clave
    • Marca de tiempo
    • ConcurrencyCheck
    • Obligatorio
    • MinLength
    • MaxLength
    • StringLength

    System.ComponentModel.DataAnnotations.Schema incluye el siguientes atributos que tienen un impacto en el esquema de la base de data.

    • Tabla
    • Columna
    • Índice
    • ForeignKey
    • NotMapped
    • InverseProperty

    Clave

    Entity Framework se basa en que cada entidad tenga uUn valor clave que utiliza para rastrear entidades. Una de las convenciones de las que Code First depende es como implica que propiedad es la clave en cada una de las classs de Code First.

    • La convencion es buscar una propiedad llamada "Id " o una propiedad que combine el nombre de la class y "Id ", como "StudentId ".

    • La propiedad se asignara a una columna de clave principal en la base de data.

    • El alumno, las classs de Inion y las classs siguen esta convencion.

    Ahora suponga que la class Student usa el nombre StdntID en lugar de ID. Cuando Code First no puede encontrar una propiedad que coincida con esta convencion, generara una excepcion debido al requisito de Entity Framework de que debe tener una propiedad clave. Puede utilizar la anotacion de clave para especificar la propiedad que se utilizara como EntityKe. y.

    Veamos el siguiente codigoant de una class Student que contiene StdntID, pero no sigue la convencion Code First por defecto. Entonces, para manejar esto, se agrega un atributo de clave que lo convertira en una clave principal.

    class publica Estudiante {[Clave] public int StdntID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Cuando ejecute su aplicacion y examine su base de data en el Explorador de SQL Server, vera que la clave principal ahora es StdntID en la tabla Estudiantes.

     Entity Framework - Guia rapida

    Entity Framework tambien admite claves compuestas. claves compuestas tambien son claves primarias compuestas por varias propiedades. Por ejemplo, tienes una class DrivingLicense cuya clave principal es una combinacion de LicenseNumber y IssuingCountry.

    public class DrivingLicense {[Key, Column (Order = 1)] public int LicenseNumber {get; juntos; } [Clave, columna (Orden = 2)] cadena publica IssuingCountry {get; juntos; } Public DateTime Emitido {get; juntos; } Public DateTime Expires {get; juntos; }}

    Cuando tiene claves compuestas, Entity Framework requiere que establezca un orden de propiedades de clave. Puede hacer esto usando la anotacion de columna para especificar un orden.

    Entity Framework - Guia rapida

    Timestamp

    Code First tratara las propiedades de timestamp de la misma manera que las propiedades de ConcurrencyCheck, pero tambien asegurara que el campo de la base de data que el codigo genera primero no sea anulable.

    • Es mas comun 'use campos de version de fila o marca de tiempo para la verificacion de simultaneidad.

    • En lugar de usar la anotacion ConcurrencyCheck, puedeutilice la anotacion TimeStamp mas especifica siempre que el tipo de propiedad sea una matriz de bytes.

    • Solo puede tener una marca de tiempo de propiedad en una class determinada.

    Tomemos un ejemplo simple agregando la propiedad TimeStamp a la class del curso -

    class publica Curso {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } [Marca de tiempo] byte publico TStamp {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Como puede ver en el ejemplo anterior, el atributo Timestamp se aplica a la propiedad Byte de la class Course. Por lo tanto, Code First creara una columna de marca de tiempo TStamp en la tabla Cursos.

    ConcurrencyCheck

    La anotacion ConcurrencyCheck le permite marcar una o mas propiedades como utilizadas para la verificacion de acceso concurrententiel en la base de data cuando un usuario modifica o elimina una entidad. Si ha trabajado como rey con EF Designer, esto se alinea con la configuracion ConcurrencyMode de una propiedad en Fixed.

    Echemos un vistazo a un ejemplo simple de como funciona ConcurrencyCheck agregandolo a la propiedad Titulo en la class del curso.

    curso de class publica {public int CourseID {get; juntos; } [ConcurrencyCheck] titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } [Marca de tiempo, Tipo de data ( "marca de tiempo ")] byte publico Marca de tiempo {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    En la class del curso anterior, el atributo ConcurrencyCheck se aplica a la propiedad de titulo existente. Ahora Code First incluira la columna Titulo en el comando de actualizacion para verificar la concurrencia optimista como se muestra en el siguiente codigo.

    exec sp_executesql N 'ACTUALIZAR [dbo]. [Cursos] SET [Titulo] = @ 0 WHERE (([CourseID] = @ 1) AND ([Titulo] = @ 2)) ', N ' @ 0 nvarchar (max), @ 1 int, @ 2 nvarchar (max) ', @ 0 = N ' Matematicas ', @ 1 = 1, @ 2 = N ' Calculo 'go

    Anotacion requerida

    La anotacion requerida le dice a EF que se requiere una propiedad en particular. Echemos un vistazo a la siguiente class de Estudiante donde se agrega la ID requerida a la propiedad FirstMidName. El atributo obligatorio obligara a EF a asegurarse de que la propiedad contiene data.

    public class Student {[Key] public int StdntID {get ; ensemble;} [Obligatorio] Public string LastName {get; ensemble;} [Obligatorio] public string FirstMidName {get; ensemble;} public DateTime EnrollmentDate {get; ensemble;} Public virtual inions ICollection {get; ensemble;} }

    Como se ve en el ejemplo anterior, el atributo obligatorio se aplica a FirstMidName y LastName. Por lo tanto, Code First creara columnas NOT NULL FirstMidName y LastName en la tabla Estudiantes como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    MaxLength

    El atributo TL 'MaxLength le permite especificar validaciones de propiedades adicionales. Se puede aplicar a una propiedad de tipo cadena o matriz de una class de dominio. EF Code First establecera el tamano de una columna como se especifica en el atributo MaxLength.

    Echemos un vistazo a la siguiente class del curso donde el atributo MaxLength (24) se aplica a la propiedad del titulo.

    curso de class publica {public int CourseID {get; juntos; } [ConcurrencyCheck] [MaxLength (24)] cadena publica Titulo {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Cuando ejecuta la aplicacion anterior, Code First crea un titulo de columna nvarchar (24)en la tabla CourseId como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Cuando el usuario define un titulo que contiene mas de 24 caracteres, EF se iniciara EntityValidationError.

    MinLength

    El atributo MinLength tambien le permite especificar validaciones de propiedad adicionales, como lo hizo con MaxLength. El atributo MinLength tambien puede utilizarse con el atributo MaxLength como se muestra en el siguiente codigo.

    public class Course {public int CourseID {get; ensemble;} [ConcurrencyCheck] [MaxLength (24 ), MinLength (5)] cadena publica Titulo {get; ensemble;} public int Credits {get; ensemble;} Iniones virtuales publicas ICollection {get; ensemble;}}

    EF lanzara EntityValidationError, si establece un valor de propiedad de Titulo menor que la longitud especificada en el atributo MinLength o mayor que la longitud especificada en el atributo MaxLength.

    StringLength

    StringLength tambien le permite especificar validaciones de propiedades adicionales como MaxLength. La unica diferencia es que el atributo StringLength solo se puede aplicar a una propiedad de tipo Cadena de class de dominio.

    curso de class publica {public int CourseID {get; juntos; } [StringLength (24)] cadena publica Titulo {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Entity Framework tambien valida el valor de una propiedad para el atributo StringLength. Si el usuario define el titulo que contiene mas de 24 caracteres, EF arrojara EntityValidationError.

    Tabla

    Codigo predeterminado La primera convencion crea un nombre de tabla similar al nombre de la class. Si deja que Code First cree la base de data y tambien desea cambiar el nombre de las tablas que crea. Entonces -

    • Puede usar Code First con una base de data existente. Pero no siempre es el caso que los nombres de las classs coincidan con los nombres de las tablas en su base de data.

    • El atributo de tabla anula esta convencion predeterminada.

    • EF Code First creara una tabla con un nombre especificado en el atributo Table para una class de dominio determinada.

    Echemos un vistazo al siguiente ejemplo donde la class se llama Estudiante y por convencion Code First asume que esto se asignara a una tabla llamada Estudiantes . Si este no es el caso, puede especificar el nombre de la tabla con el atributo Table como se muestra en el siguiente codigo.

    [Table ( "StudentsInfo ")] public class Student {[Key] public int StdntID {get; juntos; } [Obligatorio] cadena publica Apellido {get; juntos; } [Obligatorio] cadena publica FirstMidName {get; juntos; } public DateTime EnrollmentDate {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Ahora puede ver que el atributo Table especifica la tabla como StudentsInfo. Cuando se genera la tabla, vera el nombre de la tabla StudentsInfo como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    No solo puede especificar el nombre de la tabla, sino que tambien puede especificar un esquema para la tabla usando el atributo Table como se muestra en el siguiente codigo.

    [Table (" StudentsInfo ", Schema = " Admin ")] public class Student {[Key] public int StdntID {get; ensemble;} [Obligatorio] public string LastName {get; ensemble; } [Obligatorio] public string FirstMidName {get; ensemble;} public DateTime EnrollmentDate {get; ensemble;} Public virtual inions ICollection {get; ensemble;}}

    Puede ver en el ejemplo anterior, la tabla se especifica con el scadministracion hema. Ahora Code First creara la tabla StudentsInfo en el esquema de administracion como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Columna

    Tambien es lo mismo que el atributo Tabla, pero el atributo Tabla reemplaza el comportamiento de la tabla mientras que el atributo Columna reemplaza el comportamiento del columna. La convencion predeterminada de Code First crea un nombre de columna similar al nombre de la propiedad. Si deja que Code First cree la base de data y tambien desea cambiar los nombres de las columnas en sus tablas. Entonces -

    • El atributo de columna anula la convencion predeterminada.

    • EF Code First creara una columna con un nombre especificado en el atributo Column para una propiedad dada.

    Echemos un vistazo al siguiente ejemplo donde la propiedad se llama FirstMidName y por convencion, Code Primero asume que esto coincidira con una columna llamada FirstMidName.

    De lo contrario, puede especificar el nombre de la columna con el atributo Column como se muestra en el siguiente codigo.

    estudiante de class publica {ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } [Columna ( "Nombre ")] cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Puede ver que el atributo Columna especifica la columna n como Nombre. Cuando se genera la tabla, vera el nombre de la columna FirstName como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Index

    El atributo Index se introdujo en Entity Framework 6.1. esta utilizando una version anterior, la informacion de esta seccion no se aplica.

    • Puede crear un indice en una o mas columnas usando IndexAttribute.

    • Adiciondel atributo a una o mas propiedades obligara a EF a crear el indice correspondiente en la base de data al crear la base de data.

    • Los indices hacen que la recuperacion de data sea mas rapida y eficiente en la mayoria de los casos. Sin embargo, sobrecargar una tabla o vista con indices puede afectar negativamente al rendimiento de otras operaciones, como inserciones o actualizaciones.

    • La indexacion es la nueva caracteristica de Entity Framework que le permite mejorar el rendimiento de su aplicacion Code First al reducir el tiempo requerido para realizar consultas data de la base de data.

    • Puede agregar indices a su base de data usando el atributo Index y anular los parametros unicos y agrupados predeterminados para obtener el indice que mejor se adapta a su escenario.

    • De forma predeterminada, el indice se llamara IX_

    Veamos el siguiente codigo en el que se agrega el atributo Index en la class del curso para creditos.

    curso de class publica {public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; } [Índice] public int Credits {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Puede ver que el atributo Index se aplica a la propiedad Credits. Cuando se genera la tabla, vera IX_Credits en los indices.

     Entity Framework - Guia rapida

    Por defecto, los indices no son unicos, pero puedes usar el parametro con nombre IsUnique para especificar que un indice debe ser unico. El siguiente ejemplo muestra un indice unico como se muestra en el siguiente codigo.

    public class Course {public int CourseID {get; ensemble;} [Index (IsUnique = true)] public string Title {get; ensemble;} [Index] public int Credits {get;juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    ForeignKey

    La convencion Code First se ocupara de las relaciones mas comunes en su modelo, pero hay ocasiones en las que necesita ayuda. Por ejemplo, cambiar el nombre de la propiedad de clave en la class Student creo un problema con su relacion con la class inion.

    Inscripcion de class publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} class publica Estudiante {[Clave] public int StdntID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    LorAl generar la base de data, Code First ve la propiedad StudentID en la class Enrollment y la reconoce, por convencion que coincide con un nombre de class mas "ID", como una clave externa para la class Student. . Sin embargo, no hay propiedad StudentID en la class Student, pero la propiedad StdntID es la class Student.

    La solucion para esto es crear una propiedad de navegacion en Enrollment y usar ForeignKey DataAnnotation para ayudar a Code First a entender como construir la relacion entre las dos classs como se muestra en el siguiente codigo.

    Inscripcion de class publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } [ForeignKey ( "StudentID ")] Estudiante estudiante publico virtual {get; juntos; }}

    Ahora puede voir que el atributo ForeignKey se aplica a la propiedad de navegacion.

     Entity Framework - Guia rapida

    NotMapped

    De forma predeterminada, las convenciones Code First, cada propiedad de un tipo de data admitido que incluye getters y setters se representa en la base de data. Pero este no es siempre el caso en sus aplicaciones. El atributo NotMapped anula esta convencion predeterminada. Por ejemplo, puede tener una propiedad en la class Student como FatherName, pero no es necesario almacenarla. Puede aplicar el atributo NotMapped a una propiedad FatherName para la que no desea crear una columna en la base de data, como se muestra en el siguiente codigo.

    class publica Estudiante {[Clave] public int StdntID {get; juntos; } cadena publica LastName {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } [NotMapped] public int FatherName{obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Puede ver que el atributo NotMapped se aplica a la propiedad FatherName. Cuando se genera la tabla, vera que la columna FatherName no se creara en una base de data, pero esta presente en la class Student.

     Entity Framework - Guia rapida

    Code First no creara una columna para una propiedad, que no tiene getters ni setters como se muestra en el siguiente ejemplo de propiedades de direccion y edad de la class Student.

    InverseProperty

    InverseProperty se usa cuando tiene varias relaciones entre classs. En la class inion, es posible que desee realizar un seguimiento de quien es Inscribi un curso actual y un curso anterior. Agreguemos dos propiedades de navegacion para la class de inscripcion.

    public class Enrollment {public int EnrollmentID {get; ensemble;} public int CourseID {get; set;} publicoint StudentID {obtener; juntos; } ¿Nota publica? Grade {get; juntos; } Curso virtual publico CurrCourse {get; juntos; } Curso virtual publico PrevCourse {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}

    De manera similar, tambien debera agregar la class del curso a la que hacen referencia estas propiedades. La class Course tiene propiedades de navegacion a la class Inion, que contiene todas las inions actuales y anteriores.

    curso de class publica {public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; } [Índice] public int Credits {get; juntos; } public virtual ICollection CurrEnrollments {get; juntos; } public virtual ICollection PrevEnrollments {get; juntos; }}

    Code First crea la columna de clave externa {Nombre de class} _ {Clave principal}, si la propiedad de la clave externa no esta incluida en una class en particular como se muestra en las classs siguientes. encima. Cuando el fondoCuando se generan los data, vera las siguientes claves externas.

     Entity Framework - Guia rapida

    Como puede ver, Code first no 'no puede igualar las propiedades de las dos classs por si mismo. La tabla de la base de data para inions debe tener una clave externa para CurrCourse y otra para PrevCourse, pero Code First creara cuatro propiedades de clave externa, es decir,

    • CurrCourse _CourseID
    • PrevCourse _CourseID
    • Course_CourseID y
    • Course_CourseID1

    Para resolver estos problemas, puede utilizar la anotacion InverseProperty para especificar la alineacion de las propiedades.

    curso de class publica {public int CourseID {get; juntos; } Titulo de cadena publica {get; juntos; } [Índice] public int Credits {get; juntos; } [InverseProperty ( "CurrCourse ")] ICollection publico virtual CurrEnrollments {get; juntos; } [InverseProperty ( "PrevCourse ")] public virtual ICollection PrevEnrollments {get; ensemble;}}

    Como puede ver, el atributo InverseProperty se aplica en la class del curso anterior especificando que propiedad de referencia de la class Enrollment a la que pertenece. Ahora Code First generara una base de data y creara solo dos columnas de clave externa en la tabla Enrollments como se muestra en la siguiente imagen.

    Entity Framework - Guia rapida

    Le recomendamos que ejecute el ejemplo anterior paso a paso para comprenderlo mejor.

    Entity Framework - API Fluent

    La API Fluent es una forma avanzada de especificar la configuracion del modelo que cubre todo lo que pueden hacer las anotaciones de data ademas de una configuracion mas avanzada que no es posible con anotaciones de data. Anotaciones de data y l ' 'Fluent API se puede usar en conjunto, pero Code First da prioridad a Fluent API> anotaciones de data> convenciones por defecto.

    • La API Fluent es otra forma de configurar sus classs de dominio.

    • A la API Code First Fluent se accede con mayor frecuencia anulando el metodo OnModelCreating en su DbContext derivado.

    • La API Fluent proporciona mas funciones de configuracion que DataAnnotations. La API de Fluent admite los siguientes tipos de asignaciones.

    En este capitulo continuaremos con el ejemplo simple que contiene las classs de Estudiante, Curso e Inscripcion y una class de contexto con el nombre MyContext como se muestra en el codigo Proximo.

    usando System.Data.Entity; utilizando System.Linq; usando System.Text; usando System.Threading.Tasks; namespace EFCodeFirstDemo {class Program {static void Main (string args) {}} public fr um Grade {A, B, C, D, F} Inion a la class publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener;juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} Estudiante de class publica {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }} public class MyContext: DbContext {Curso virtual de DbSet public {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}}

    Para acceder a la API Fluent, debe anular el metodo OnModelCreating en DbContext. Echemos un vistazo aun ejemplo simple donde cambiaremos el nombre de la columna en la tabla de estudiantes de FirstMidName a FirstName como se muestra en el siguiente codigo.

    public class MyContext: DbContext {anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {modelBuilder.Entity () .Property (s ⇒ s.FirstMidName) .HasColumnName ( "FirstName ");} curso Virtual DbSet public {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    DbModelBuilder se utiliza para asignar classs CLR a un esquema de base de data. Esta es la class principal y en la que puede configurar todas sus classs de dominio. Este enfoque centrado en el codigo para crear un modelo de data de entidad (EDM) se conoce como Code First.

    La API Fluent proporciona varios metodos importantes para configurar entidades ys para anular varias convenciones de codigo primero. Éstos son algunos de ellos.

    Sr. No. Nombre del metodo & Deion
    1

    ComplexType

    Registrar un tipo como complejo, ingresar el patron y devolver un objeto que se puede usar para configurar el tipo complejo. Este metodo se puede llamar varias veces para el mismo tipo a fin de realizar multiples lineas de configuracion.

    2

    Entidad

    Registrar un tipo entidad como parte del modelo y devuelve un objeto que se puede utilizar para configurar la entidad. Este metodo se puede llamar varias veces para que la misma entidad realice varias lineas de configuracion.

    3

    HasKey

    Configure el o propiedades claveprincipal para este tipo de entidad.

    4

    HasMany

    Configura muchos relaciones de este tipo de entidad.

    5

    HasOptional

    Configurar una relacion opcional de este tipo de entidad. Las instancias del tipo de entidad se pueden guardar en la base de data sin que se especifique esta relacion. La clave externa en la base de data sera anulable.

    6

    HasRequired

    Configurar una relacion obligatorio de este tipo de entidad. Las instancias del tipo de entidad no se podran guardar en la base de data a menos que se especifique esta relacion. La clave externa de la base de data no admitira nulos.

    7

    Ignorar

    Excluye una propiedad del modelo para que no se asigne a labase de data. (Heredado de StructuralTypeConfiguration )

    8

    Propiedad

    Configura una propiedad de estructura establecida para este tipo. (Heredado de StructuralTypeConfiguration )

    9

    ToTable (String)

    Configure el nombre de la tabla a la que se asigna este tipo de entidad.

    La API Fluent le permite configurar sus entidades o sus propiedades, ya sea que desee cambiar algo sobre la forma en que se asignan a la base. data o como se relacionan entre si. Existe una amplia variedad de asignaciones y modelos en los que puede influir mediante configuraciones. Estos son los principales tipos de mapeo compatibles con Fluent API:

    • Mapeo de entidades
    • Mapeo de propiedades

    Mapeo de entidades

    El mapeo de entidades es solo unos pocos mappagEstos son simples y afectaran la comprension de Entity Framework sobre como se asignan las classs a las bases de data. Hemos discutido todo esto en Anotaciones de data y aqui veremos como lograr las mismas cosas usando Fluent API.

    • Entonces, en lugar de ir a las classs de dominio para agregar estas configuraciones, podemos hacerlo dentro del contexto.

    • Lo primero que debe hacer es anular el metodo OnModelCreating, que permite trabajar con modelBuilder.

    Esquema predeterminado

    El esquema predeterminado es dbo cuando se genera la base de data. Puede utilizar el metodo HasDefaultSchema en DbModelBuilder para especificar el esquema de base de data que se utilizara para todas las tablas, procedimientos almacenados, etc.

    Echemos un vistazo al siguiente ejemplo en el que se aplica el esquema de administracion.

    public class MyContext: DbContext {public MyContext (): base (" name = MyContextDB ") {} protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder. HasDefaultSchema (" Admin ");} Cursos de DbSet virtuales publicos {get; ensemble;} Inions virtual DbSet public {get; ensemble;} public virtual DbSet Students {get; ensemble;}}

    Asignar entidad a tabla

    Con la convencion predeterminada, Code First creara tablas de base de data con el nombre de las propiedades de DbSet en la class de contexto, como Cursos, Inions y Estudiantes. Pero si desea nombres de tabla diferentes, puede anular esta convencion y proporcionar un nombre de tabla diferente al de las propiedades de DbSet, como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el mod de esquema predeterminadoelBuilder.HasDefaultSchema ( "Admin "); // Asigna la entidad a la tabla modelBuilder.Entity () .ToTable ( "StudentData "); modelBuilder.Entity () .ToTable ( "CourseDetail "); modelBuilder.Entity () .ToTable ( "EnrollmentInfo "); }

    Cuando se genera la base de data, vera el nombre de las tablas como se especifica en el metodo OnModelCreating.

     Entity Framework - Guia rapida

    Division de entidades (asigne la entidad a varias tablas )

    La division de entidades le permite combinar data de varias tablas en una sola class y solo se puede usar con tablas que tienen una relacion uno a uno entre ellas . Echemos un vistazo al siguiente ejemplo donde la informacion del estudiante se asigna en dos tablas.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configurar el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Asigna la entidad a la tabla modelBuilder.Entity () .Map (sd ⇒ {sd.Properties (p ⇒ new {p.ID, p.FirstMidName, p.LastName}); sd.ToTable ( "StudentData ");}) .Map (if ⇒ {si.Properties (p ⇒ new {p.ID, p.EnrollmentDate}); si.ToTable ( "StudentEnrollmentInfo ");}); modelBuilder.Entity () .ToTable ( "CourseDetail "); modelBuilder.Entity () .ToTable ( "EnrollmentInfo "); }

    En el codigo anterior, puede ver que la entidad Student esta

  • StudentData : contiene el nombre y apellido del estudiante.

  • StudentEnrollmentInfo : contiene EnrollmentDate.

  • Cuando se genera la base de data, ve las siguientes tablas en su base de data como se muestra en la imagensiguiente, proximo.

     Entity Framework - Guia rapida

    Asignacion de propiedades

    El metodo Property se utiliza para configurar los atributos de cada propiedad perteneciente a una entidad o tipo complejo. El metodo Property es se utiliza para obtener un objeto de configuracion para una propiedad determinada. Tambien puede asignar y configurar las propiedades de sus classs de dominio mediante la API Fluent.

    Configuracion de una clave primaria

    La convencion predeterminada para las claves primarias es -

    • La class define una propiedad cuyo nombre es "ID " o "Id
    • Nombre de la class seguido de "ID " o "Id

    Si su class no sigue las convenciones predeterminadas para la clave principal como se muestra en el siguiente codigo de la class Student -

    public class Student {public int StdntID {get; set;} public string LastName {get; set; } public string FirstMidName {get; set;} publicc DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Luego, para establecer explicitamente una propiedad como clave principal, puede utilizar el metodo HasKey como se muestra en el siguiente codigo:

    protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configure la clave principal modelBuilder.Entity () .HasKey (s ⇒ s.StdntID); }

    Configurar columna

    En Entity Framework, de forma predeterminada, Code First creara una columna para una propiedad con el mismo nombre, orden y tipo de data. Pero tambien puede anular esta convencion, como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configura el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configure la columna EnrollmentDate modelBuilder.Entity () .Property (p ⇒ p.EnrollmentDate) .HasColumnName (" EnDate ") .HasColumnType (" DateTime ") .HasColumnOrder (2 );}

    Configure la propiedad MaxLength

    En el siguiente ejemplo, la propiedad Titulo del curso no debe exceder los 24 caracteres. Cuando el usuario especifica un valor mayor que 24 caracteres, obtiene una DbEntityValidationException.

    protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder. HasDefaultSchema ( "Admin ") ; modelBuilder.Entity () .Property (p ⇒ p.Title) .HasMaxLength (24);}

    Configure la propiedad Null o NotNull

    En el ejemplo A continuacion, se requiere la propiedad Titulo del curso, por lo que se usa el metodo IsRequired para crear la columna NotNull. De manera similar, Student EnrollmentDate es opcional, usaremos donc el metodo IsOptional para permitir un valor nulo en esta columna como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); modelBuilder.Entity () .Property (p ⇒ p.Title) .IsRequired modelBuilder.Entity () .Property (p ⇒ p.EnrollmentDate) .IsOptional //modelBuilder.Entity().Property(s ⇒ s.FirstMidName) //. HasColumnName ( "Nombre "); }

    Configurar relaciones

    Una relacion, en el contexto de bases de data, es una situacion que existe entre dos tablas de bases de data relacionales, cuando una tabla tiene una clave externa que se refiere a la clave principal de la otra tabla. Cuando trabaja con Code First, define su modelo definiendo las classs CLR de su dominio. De forma predeterminada, Entity Framework usa las convencionesns Code First para asignar sus classs al esquema de la base de data.

    • Si usa el comando de nomenclatura Code First ventions, en la mayoria de los casos puede confiar en Code First para configurar las relaciones entre sus tablas basado en claves externas y propiedades de navegacion.

    • Si no cumplen con estas convenciones, tambien hay configuraciones que puede utilizar para influir en las relaciones entre classs y como se realizan estas relaciones en la base de data cuando agrega configuraciones en Code First.

    • Algunos de estos estan disponibles en anotaciones de data y puede aplicar otros mas complicados con una API fluida.

    Configurar una relacion uno a uno

    Cuando define una relacion uno a uno en su modelo, esta utilizando una propiedad de navegacion de referenciance en cada class. En la base de data, las dos tablas solo pueden tener un registro en cada lado de la relacion. Cada valor de clave principal es para un solo registro (o ningun registro) en la tabla relacionada.

    • Se crea una relacion uno a uno si ambas columnas asociadas son claves primarias o tienen restriccionesunicas.

    • En una relacion uno a uno, la clave principal actua adicionalmente como una clave externa y no hay una clave de columna de clave externa separada para la una u otra de las tablas.

    • Este tipo de relacion no es comun porque la mayor parte de la informacion asociada de esta manera estaria toda en una sola tabla.

    Echemos un vistazo al siguiente ejemplo donde agregaremos otra class en nuestro modelo para crear una relacion uno a uno.

    class publica Estudiante {ID public int {get; juntoslos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } StudentLogIn publico virtual StudentLogIn {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }} public class StudentLogIn {[Clave, ForeignKey ( "Estudiante ")] public int ID {get; juntos; } cadena publica EmailID {get; juntos; } cadena publica Contrasena {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}

    Como puede ver en el codigo anterior, los atributos Key y ForeignKey se utilizan para la propiedad ID en la class StudentLogIn, con el fin de marcarla como clave principal y como clave externa.

    Para configurar una relacion de uno a cero o uno entre Student y StudentLogIn utilizando la API de Fluent, debe anular el metodo OnModelCreating como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configurar ID como PK para StudentLogIn modelBuilder.Entity () .HasKey (s ⇒ s.ID); // Configure el ID como FK para StudentLogIn modelBuilder.Entity () .HasOptional (s ⇒ s.StudentLogIn) // StudentLogIn es opcional .WithRequired (t ⇒ t.Student); // Crear relacion inversa}

    En la mayoria de los casos, Entity Framework puede inferir que tipo es el dependiente y cual es el principal en una relacion. Sin embargo, cuando ambos extremos de la relacion son obligatorios o ambos lados son opcionales, Entity Framework no puede identificar al dependiente y al principal. Cuando se requieren ambos extremos de la relacion, puede usar HasRequired como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configuestablece el modelo de esquema predeterminado .HasDefaultSchema ( "Admin "); // Configurar ID como PK para StudentLogIn modelBuilder.Entity () .HasKey (s ⇒ s.ID); // Configure el ID como FK para StudentLogIn modelBuilder.Entity () .HasRequired (r ⇒ r.Student) .WithOptional (s ⇒ s.StudentLogIn); }

    Cuando se genera la base de data, vera que la relacion se crea como se muestra en la siguiente imagen.

    Entity Framework - Guia rapida

    Configurar una relacion de uno a muchos

    La tabla de clave primaria contiene un solo registro que no se relaciona con ninguno, uno o mas registros en la tabla asociada . Este es el tipo de relacion mas comunmente utilizado.

    • En este tipo de relacion, una fila en la tabla A puede tener varias filas correspondientes en la tabla B, pero una fila en la tabla B solo puede tener una fila coincidente en la tabla A.

    • La clave externa es definite sobre la mesa que representa el final de la relacion.

    • Por ejemplo, en el diagrama anterior, las tablas Student e Inion tienen una relacion de uno a muchos, cada estudiante puede tener multiples iniones, pero cada inion pertenece a solo un estudiante.

    Aqui esta el estudiante y el inion que tienen una relacion de uno a muchos, pero la clave externa en la tabla inion no sigue la Convenciones de Code First por defecto.

    Inscripcion de class publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } // StdntID no sigue las primeras convenciones del codigo name public int StdntID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} Estudiante de class publica {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } public DateTime EnrollmentDate {obtener; juntos; } StudentLogIn publico virtual StudentLogIn {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    En este caso, para configurar una relacion de uno a varios utilizando la API de Fluent, debe utilizar el metodo HasForeignKey como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configurar FK para una relacion de uno a varios modelBuilder.Entity () .HasRequired (s ⇒ s.Student) .WithMany (t ⇒ t.Enrollments) .HasForeignKey (u ⇒ u.StdntID) ; }

    Cuando se genera la base de data, vera que la relacion se crea como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    En el ejemplo anterior, el metodo HasRequired especifica que la propiedad de navegacion del estudiante debe ser nula, por lo que debe asignar una portity Student con inion cada vez que agregue o actualice el inion. Para manejar esto, necesitamos usar el metodo HasOptional en lugar del metodo HasRequired.

    Configurar la relacion de varios a varios

    Cada registro de ambas tablas puede hacer referencia a cualquier numero de registros (o no registros) en la 'otra mesa.

    • Puede crear una relacion de este tipo definiendo una tercera tabla, llamada tabla de union, cuya clave principal se compone de las claves externas de las tablas A y B.

    • Por ejemplo, la tabla Student y la tabla Course tienen una relacion de varios a varios.

    Se trata de classs de curso y alumno en las que el curso y el alumno tienen una relacion de varios a varios, ya que ambas classs tienen propiedades de navegacion de alumnos y cursos que son colecciones. En otras palabras, una entidad tiene otra coleccion de entidades.

    estudiante de class publica {ID int publico {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Cursos virtuales publicos ICollection {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } public virtual ICollection Students {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Para configurar la relacion de varios a varios entre el alumno y el curso, puede utilizar la API de Fluent como se muestra en el siguiente codigo.

    anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configurar el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // VSonfigurar la relacion de varios a muchos modelBuilder.Entity () .HasMany (s ⇒ s.Courses) .WithMany (s ⇒ s.Students); }

    Las convenciones predeterminadas de Code First se utilizan para crear una tabla de combinacion cuando se genera la base de data. Por lo tanto, la tabla StudentCourses se crea con las columnas Course_CourseID y Student_ID como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Si desea especificar el nombre de la tabla de union y los nombres de las columnas de la tabla, debe realizar una configuracion adicional utilizando el metodo Map.

    protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configurar esquema default modelBuilder.HasDefaultSchema ( "Admin "); // Configure la relacion de varios a varios modelBuilder.Entity () .HasMany (s ⇒ s.Cursos) .WithMany (s ⇒ s.Estudiantes). Map (m ⇒ {m.ToTable ( "StudentCoursesTable "); m.MapLeftKey ( "StudentID "); m.MapRightKey (" CourseID ");});}

    Puede ver cuando se genera la base de data, el nombre de la tabla y las columnas se crean segun lo especificado en el codigo anterior.

    Recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

    Entity Framework - Database Seed

    En Entity Framework, Seed se introdujo en EF 4.1 y funciona con inicializadores de base de data. La idea general de un metodo semilla es inicializar data en una base de data creada por Code First o evolucionada por migraciones. Estos data a menudo son data de pruebas, pero tambien pueden ser data de referencia, como listas de estudiantes conocidos, cursos, etc. Cuando se inicializan los data, hace lo siguiente:

    • Comprueba si la base de data de destino ya existe.
    • Si esSi es asi, entonces el C odo actual El primer modelo se compara con el modelo almacenado en los data de la base de data.
    • La base de data se elimina si el modelo actual no coincide con el modelo de la base de data.
    • La base de data se crea si se elimino o no existia en primer lugar.
    • Si se ha creado la base de data, se llama al metodo de inicializacion de Seed.

    El metodo Seed toma el objeto de contexto de la base de data como parametro de entrada y el codigo del metodo usa este objeto para agregar nuevas entidades a la base de data de data. Para generar data en su base de data, debe anular el metodo Seed. Echemos un vistazo al siguiente ejemplo donde algunos de los data predeterminados se inician en la base de data en una class interna.

    class privada UniDBInitializer : DropCreateDatabaseAlways {Seed vacio anulado protegido (contexto MyContext) {IList Students = new List estudiantes.Anadir (nuevo Estudiante () {NombrePrimerMedio = "Andres ", Apellido = "Pedro ", Fecha de inscripcion = Fecha y hora.Parse (Fecha y hora.Hoy.ToString ())}); estudiantes.Agregar (nuevo Estudiante () {NombrePrimerMedio = "Brice ", Apellido = "Lambson ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); estudiantes.Agregar (nuevo Estudiante () {NombrePrimerMedio = "Rowan ", Apellido = "Miller ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); foreach (estudiante que estudia en estudiantes) context.Students.Add (estudiante); base.Seed (contexto); }}

    En el codigo anterior, se inicializa la tabla de estudiantes. Debe definir esta class de inicializacion de base de data en la class de contexto como se muestra en el siguiente codigo.

    public MyContext (): base ( "name = MyContextDB ") {Database .SetInitializer (nuevoUniDBInitializer ()); }

    Aqui esta la implementacion completa de la class MyContext, que tambien contiene la class de inicializacion DB.

    public class MyContext: DbContext {public MyContext (): base ( "name = MyDBontext ") {Database.SetInitializer (nuevo UniDBInitializer ());} Cursos de DbSet virtuales publicos {get; set;} public virtual DbSet Enrollments {get; set;} public virtual DbSet Students {get; set;} class privada UniDBInitializer : DropCreateDatabaseAlways {anulacion protegida de semilla vacia (contexto de MyContext) {IList Students = new List Students.Add (new Student () {FirstMidName = "Andrew", LastName = "Peters ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); estudiantes.Agregar (nuevo Estudiante () {FirstMidName = "Brice ", LastName = "Lambson ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); Students.Add (new Student () {FirstMidName = "Rowan ", LastName = "Miller ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}); foreach (estudiante que estudia en estudiantes) context.Students.Add (estudiante); base.Seed (context);}}}

    Cuando se compila y ejecuta el ejemplo anterior, puede ver los data en una base de data como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Le recomendamos que ejecute el ejemplo anterior, paso a paso, para una mejor comprension.

    Entity Framework - Code First Migration

    Entity Framework 4.3 incluye una nueva funcion de migracion Code First que le permite hacer evolucionar gradualmente el esquema de la base de data a medida que su modelo cambia con el tiempo. Para la mayoria de los desarrolladores, esta es una gran mejora con respecto a las opciones de inicializacion de la base de data de versiones 4.1 y 4.2 que requieren que actualiceactualice manualmente la base de data o sueltela y vuelva a crearla cuando su modelo haya cambiado.

    • Antes de Entity Framework 4.3, si ya tiene data (distintos de los data iniciales) o procedimientos almacenados, desencadenadores, etc. existente en su base de data, estas estrategias le permitieron eliminar toda la base de data y volver a crearla. perderia data y otros objetos ts DB.

    • Con la migracion, se actualizara automaticamente el esquema de la base de data, cuando su modelo cambie sin perder los data existentes u otros objetos de la base de data.

    • Utiliza un nuevo inicializador de base de data llamado MigrateDatabaseToLatestVersion.

    Hay dos tipos de migracion:

    • Migracion automatizada
    • Migracion basada en el codigo

    Migracion automatizada

    Se ha introducido la migracion automatizada parapor primera vez en Entity Framework 4.3. En la migracion automatizada, no es necesario procesar la migracion de la base de data manualmente en el archivo de codigo. Por ejemplo, para cada cambio, tambien debera cambiar sus classs de dominio. Pero con la migracion automatizada, solo necesita ejecutar un comando en la consola del administrador de paquetes para lograrlo.

    Echemos un vistazo al siguiente proceso de migracion automatizado paso a paso.

    Cuando utiliza el enfoque Code First, no tiene una base de data para su aplicacion.

    En este ejemplo, comenzaremos con nuestras 3 classs base como Student, Course e Inion como se muestra en el siguiente codigo.

    Inscripcion de class publica {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de cuellopublic virtual rs {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} Estudiante de class publica {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } [Índice] public int Credits {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Aqui esta la class de contexto.

    public class MyContext: DbContext {public MyContext (): base ( "MyContextDB ") {} public vi rtual DbSet Course {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Antes de ejecutar la aplicacion, debe habilitar la migracion automatica.

    Paso 1 : abra la Consola del Administrador de paquetes desde Herramientas → Administrador de paquetes NuGet → Consola del paquete del administrador.

    Paso 2 : para habilitar la migracion automatica, ejecute el siguiente comando en la consola del administrador de paquetes.

    PM> enable-migrations -EnableAutomaticMigrations: $ true

     Entity Framework - Guia rapida

    Paso 3 : una vez que se ha ejecutado el comando correctamente, crea una class de configuracion interna sellada en la carpeta de migracion de su proyecto como se muestra en el siguiente codigo.

    espacio de nombres EFCodeFirstDemo.Migrations {using System; utilizando System.Data.Entity; utilizando System.Data.Entity.Migrations; utilizando System.Linq; Configuracion de class interna sellada: DbMigrationsConfiguration {Configuracion publica () {AutomaticMigrationsEnabled = true; ContextKey = "EFCodeFirstDemo.MyContext} protegido override void Seed (EFCodeFirstDemo.MyContext context) {// Este metodo se llamara despues de la migracion a la ultima version. // Puede utilizar el metodo de extension auxiliar DbSet .AddOrUpdate () // para evitar la creacion de data semilla duplicados. Por ejemplo. // context.People.AddOrUpdate (// p ⇒ p.FullName, // nueva persona {FullName = "AndrewPeters "}, // nueva persona {FullName = "Brice Lambson "}, // nueva persona {Nombre completo = "Rowan Miller "} //); }}}

    Paso 4 : defina el inicializador de la base de data en la class de contexto con la nueva politica de inicializacion de la base de data MigrateDatabaseToLatestVersion.

    public class MyContext: DbContext {public MyContext (): base ( "MyContextDB ") {Database.SetInitializer (nuevo MigrateDatab aseToLatestVersion ( "MyContextDB ")); } Cursos de Virtual DbSetpublic {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Paso 5 : ha configurado la migracion automatica. Cuando ejecuta su aplicacion, automaticamente se encarga de la migracion cuando cambia de modelo.

     Entity Framework - Guia rapida

    Paso 6 - Como puede ver, tambien se crea una tabla del sistema __MigrationHistory en su base de data junto con otras tablas. En __MigrationHistory, la migracion automatizada mantiene el historial de cambios en la base de data.

    Paso 7 : al agregar otra class de entidad como esa class de dominio y ejecuta su aplicacion, crea la tabla en su base de data. Agreguemos la siguiente class StudentLogIn.

    public class StudentLogIn {[Key, ForeignKey ( "Estudiante ")] public int ID {get; ensemble;} cEmailID de cadena publica {get; juntos; } cadena publica Contrasena {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}

    Paso 8 : no olvide agregar el DBSet para la class mencionada anteriormente en su class de contexto como se muestra en el siguiente codigo.

    dbSet virtual publico StudentsLogIn {get; juntos; }

    Paso 9 : ejecute su aplicacion nuevamente y vera que la tabla StudentsLogIn se agrega a su base de data.

     Entity Framework - Guia rapida

    Los pasos mencionados anteriormente para migraciones automatizadas solo funcionaran para su entidad. Por ejemplo, para agregar otra class de entidad o eliminar la class de entidad existente, la migracion sera exitosa. Pero si agrega o elimina una propiedad a su class de entidad, generara una excepcion.

    Paso 10 : para gestionar la migracion de propiedades, debe configurar AutomaticMigrationDataLossAllowed = true en el constructor de la class de configuracion.

    configuracion publica () {AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; ContextKey = "EFCodeFirstDemo.MyContext}

    Migracion basada en codigo

    Cuando desarrolla una nueva aplicacion, su modelo de data cambia con frecuencia y cada vez que el modelo cambia, cambia. Se desincroniza con la base de data. Ha configurado Entity Framework para eliminar y recrear automaticamente la base de data cada vez que cambie el modelo de data. La migracion basada en codigo es util cuando desea tener mas control sobre la migracion.

    • Cuando agrega, elimina o modifica classs de entidad o modifica su class DbContext, la proxima vez que ejecute la aplicacion, eliminara automaticamente su base de data existente, creara una nuevatiene uno nuevo que coincide con el patron y le proporcionara data de prueba.

    • La funcion Code First Migrations resuelve este problema al permitir que Code First actualice el esquema de la base de data en lugar de eliminar y volver a crear la base de data. Para implementar la aplicacion, debera habilitar las migraciones.

    Esta es la regla basica para migrar cambios en la base de data:

    • Habilitar migraciones
    • Agregar migracion
    • Actualizar base de data

    Echemos un vistazo a los siguientes pasos: Paso de migracion de base de codigo.

    Cuando utiliza el primer enfoque de codigo, no tiene una base de data para su aplicacion.

    En este ejemplo comenzaremos de nuevo con nuestras 3 classs base como Student, Course e Inion como se muestra en el siguiente codigo.

    Inscripcion de class publica {Enrollme publico intntID {obtener; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} Estudiante de class publica {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } [Índice] public int Credits {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}

    Aqui esta la class de contexto.

    public class MyContext: DbContext {public MyContext (): base ( "MyContextDB ") {Database.SetInitializer (nuevo MigrateDatabaseToLatestVersion ( "MyContextDB ")); } Cursos publicos virtuales de DbSet {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}

    Paso 1 : antes de ejecutar la aplicacion, debe habilitar la migracion.

    Paso 2 : Abra la Consola del Administrador de paquetes desde Herramientas → Administrador de paquetes NuGet → Consola del administrador de paquetes.

    Paso 3 : la migracion ya esta habilitada, ahora agregue la migracion en su aplicacion ejecutando el siguiente comando.

    PM> add-migration "UniDB Schema

    Paso 4 : cuando el comando se ejecuta correctamente , vera que se creo un nuevo Archivo en la carpeta Migracion con el nombre del parametro que paso al comando con un prefijo de marca de tiempo como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Paso 5 : puede crearr o actualice la base de data usando el comando "update-database ".

    PM> Update-Database -Verbose

    El indicador "- Verbose " especifica que se muestren los pasos de SQL Sta aplicados a la base de data de destino en la consola.

    Paso 6 : dd otra propiedad 'Edad ' en la class del Estudiante, luego ejecute la instruccion de actualizacion.

    estudiante de class publica {ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } public int Age {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Public Virtual ICollection Inions {get; juntos; }}

    Cuando ejecute PM → Update-Database –Verbose, cuando el comando se ejecute correctamente, vera que la nueva columna Edad se agrega a su base de data.

    Entity Framework - Guia rapida

    Le recomendamos que ejecute lo anterior,paso a paso para una mejor comprension.

    Entity Framework - Multiple DbContext

    En este capitulo, aprenderemos como migrar cambios en la base de data cuando hay multiples classs DbContext en la aplicacion.

    • Varios DbContext se introdujeron por primera vez en Entity Framework 6.0.
    • Varias classs de contexto pueden pertenecer a una sola base de data oa dos bases de data diferentes.

    En nuestro ejemplo, definiremos dos classs de contexto para la misma base de data. En el siguiente codigo, hay dos classs de DbContext para Student y Teacher.

    estudiante de class publica {ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; }} class publica MyStudentContext: DbContext {publico MyStudentContext (): base ( "UniContextDB ") {} publico virtual DbSet Estudiantes {get; juntos; }} Profesor de class publica {ID public int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime HireDate {get; juntos; }} public class MyTeacherContext: DbContext {public MyTeacherContext (): base ( "UniContextDB ") {} public virtual DbSet Teachers {get; juntos; }}

    Como puede ver en el codigo anterior, hay dos modelos llamados "alumno" y "profesor". Cada uno esta asociado con una class de contexto correspondiente en particular, es decir, el estudiante esta asociado con MyStudentContext y el profesor esta asociado con MyTeacherContext.

    Esta es la regla general para migrar cambios a la base de data, cuando hay varias classs de contexto en el mismo proyecto.

    • enable-migrations -ContextTypeName MigrationsDirectory:

    • Add-Migration -configuration

    • Update-Database - configuration -Verbose

    Active la migracion para MyStudentContext ejecutando el comando siguiente en Package Manager Console.

    PM → enable-migrations -ContextTypeName: EFCodeFirstDemo.MyStudentContext

    Entity Framework - Guia rapida

    Una vez ejecutado agregaremos el modelo en el historial de migracion y para eso necesitamos ejecutar el comando add-migration en la misma consola.

    PM → add-migration -configuration EFCodeFirstDemo.Migrations.Configuration Initial

    Ahora agreguemos algunos data en el Tablas de estudiantes y profesores en la base de data.

    static void Main (stringargs) {using (var context = new MyStudentContext ()) {//// Crear y guardar una nueva consola de estudiante .WriteLine ( "Agregar nuevos estudiantes "); var student = new Student {FirstMidName = "Alain ", LastName = "Bomer ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ()) // Edad = 24}; context.Students.Add (estudiante); var student1 = new Student {FirstMidName = "Mark ", LastName = "Upston ", EnrollmentDate = Date Time.Parse (DateTime.Today.ToString ()) // Edad = 30}; context.Students.Add (estudiante1); context.SaveChanges // muestra todos los estudiantes en la base de data var estudiantes = (de s en contexto. Los estudiantes ordenan por s.FirstMidName seleccione s) .ToList Console.WriteLine ( "Obtener todos los estudiantes de la base de data: "); foreach (var stdnt en estudiantes) {string name = stdnt.FirstMidName+" + stdnt.LastName; Console.WriteLine ( "ID: {0}, nombre: {1} ", stdnt.ID, nombre); } Console.WriteLine ( "Presionepresione cualquier tecla para salir ... "); Console.ReadKey } using (var context = new MyTeacherContext ()) {//// Cree y registre una nueva consola de profesor. WriteLine ( "Anadiendo nuevos profesores "); var estudiante = nuevo profesor {FirstMidName = "Alain ", LastName = "Bomer ", HireDate = DateTime.Parse (DateTime.Today.ToString ()) // Edad = 24 }; context.Teachers.Add (estudiante); var student1 = new Teacher {FirstMidName = "Mark ", LastName = "Upston ", HireDate = DateTime.Parse (DateTime.Today.ToString ()) // Edad = 30}; context.Teachers.Add (student1); context.SaveChanges // Mostrar todos los profesores en la base de data var profesores = (de t en el contexto Profesores orderby t.FirstMidName seleccione t) .ToList Console.WriteLine ( "Obtener todos los profesores de la base de data: "); foreach (var profesor en profesores) {string name = teacher.FirstMidName+" + teacher.LastName ; Console.WriteLine ( "ID: {0}, nombre: {1} ", teacher.ID, name);} Console.WriteLine (" Presione cualquier tecla para salir ... "); Console.ReadKey }}

    Cuando se ejecuta el codigo anterior, vera que se crean dos tablas diferentes para dos modelos diferentes como se muestra en la siguiente imagen.

     Entity Framework - Guia rapida

    Recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprension.

    Entity Framework - Tipos de entidad anidados

    Antes Entity Framework 6, Entity Framework no reconocio entidades o tipos complejos que estaban anidados dentro de otras entidades o tipos complejos. Cuando Entity Framework genero el modelo, los tipos anidados simplemente desaparecieron.

    Echemos un vistazo a un ejemplo simple donde tenemos nuestro modelo base con tres entidades Student, Course e Enrollment.

    • Vamos a agregar una propiedad de identidad, que es una type Persona. Person es otra entidad, contiene las propiedades BirthDate y FatherName.

    • En terminos de Entity Framework, debido a que no tiene identidad y es parte de una entidad, es un tipo Entity Framework complejo, y hemos admitido tipos complejos desde la primera version de Entity Framework.

    • El tipo Person no esta anidado como se muestra en el siguiente codigo.

    class publica Estudiante {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } identidad de persona publica {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} public class Person {Public Person (string FatherName, DateTime birthDate) {FatherName = FatherName; Fecha de nacimiento = fecha de nacimiento; } cadena publica FatherName {get; juntos; } public DateTimeBirthDate {get; juntos; }}

    Entity Framework tambien sabra como conservar los tipos de persona cuando se use en versiones anteriores.

    Usando Entity Framework Power Tool, veremos como Entity Framework interpreta el modelo. Haga clic con el boton derecho en el archivo Program.cs y seleccione Entity Framework → Mostrar modelo de data de entidad (solo lectura)

     Entity Framework - Guia rapida

    Ahora vera que la propiedad Identity esta establecida en la class Student.

     Entity Framework - Guia rapida

    Si esta class Person no es utilizada por ninguna otra entidad, entonces podemos anidarla en el class Student, b Esta version anterior de Entity Framework no reconoce tipos anidados.

    En la version anterior, genera el modelo nuevamente, no solo no se reconoce el tipo , pero debido a que no esta alli, la propiedad tampoco esta alli, por lo que Entity Framework no conservara el tipo de persona en absoluto.

    estudiante de class publica {ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } identidad de persona publica {get; juntos; } Inions virtuales publicos ICollection {get; juntos; } public class Person {Persona publica (string FatherName, DateTime birthDate) {FatherName = FatherName; Fecha de nacimiento = fecha de nacimiento; } cadena publica FatherName {get; juntos; } Public DateTime BirthDate {get; juntos; }}}

    Con Entity Framework 6, se reconocen las entidades anidadas y los tipos complejos. En el codigo anterior, puede ver que Person esta anidado en la class Student.

    Cuando se usa Entity Framework Power Tool para mostrar como Entity Framework interpreta el modelo esta vez, existe una propiedad real de identidad y tipo complejo de persona. Entonces Entity Framework conservara estos data.

     Entity Framework - Guia rapida

    Ahora puede ver que Identity es un tipo de entidad anidada, que no era compatible antes de Entity Framework 6.

    Le recomendamos que ejecute el ejemplo anterior paso a paso para comprenderlo mejor.

    Entity Framework: procedimientos almacenados Entity Framework: procedimientos almacenados

    Entity Framework: procedimientos almacenados

    • 2020-11-20 04:41:29 | Tutorial de Entit...

    Entity Framework: procedimientos almacenadosEntity Framework le permite utilizar procedimientos almacenados en el modelo de datos de entidad en lugar de, o en combinación con, su generación automática de comandos. Puede utilizar procedimientos almacenados para ejecutar lógica predefinida en tablas d...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework - Entidades desconectadas Entity Framework - Entidades desconectadas

    Entity Framework - Entidades desconectadas

    • 2020-11-20 04:41:05 | Tutorial de Entit...

    Entity Framework - Entidades desconectadasEn este capítulo, veamos cómo realizar cambios en entidades que no van seguidas de un contexto. Las entidades que no van seguidas de un contexto se denominan entidades "desconectadas". Para la mayoría de las aplicaciones de un solo nivel, donde la interfaz d...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: función de tabla Entity Framework: función de tabla

    Entity Framework: función de tabla

    • 2020-11-20 04:40:50 | Tutorial de Entit...

    Entity Framework: función con valores de tablaEn este capítulo, aprendamos cómo mapear funciones con valores de tabla (TVF) usando Entity Framework Designer y cómo llamar a un TVF desde una consulta LINQ. Actualmente, los TVF solo se admiten en el flujo de trabajo Database First. Se introdujo por pr...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: compatibilidad con la enumeración Entity Framework: compatibilidad con la enumeración

    Entity Framework: compatibilidad con la enumeración

    • 2020-11-20 04:40:25 | Tutorial de Entit...

    Entity Framework: compatibilidad con EnumEn Entity Framework, esta funcionalidad le permitirá definir una propiedad en una clase de dominio que es un tipo de enumeración y asignarla a una columna de base de datos de un tipo entero. Entity Framework luego convertirá el valor de la base de datos hacia...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: tipo de datos espaciales Entity Framework: tipo de datos espaciales

    Entity Framework: tipo de datos espaciales

    • 2020-11-20 04:39:57 | Tutorial de Entit...

    Entity Framework: tipo de datos espacialesEl soporte para tipos espaciales se introdujo en Entity Framework 5. También se incluye un conjunto de operadores para permitir que las consultas analicen datos espaciales. Por ejemplo, una consulta puede filtrar en función de la distancia entre dos ubicacio...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework - Herencia Entity Framework - Herencia

    Entity Framework - Herencia

    • 2020-11-20 04:39:42 | Tutorial de Entit...

    Entity Framework - HerenciaLa herencia permite crear modelos complejos que reflejan mejor la forma de pensar de los desarrolladores y también reduce el trabajo requerido para interactuar con esos modelos. La herencia usada con entidades tiene el mismo propósito que la herencia usada con clases, por ...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: entidades coloreadas Entity Framework: entidades coloreadas

    Entity Framework: entidades coloreadas

    • 2020-11-20 04:38:45 | Tutorial de Entit...

    Entity Framework: entidades coloreadasEn Entity Framework, Colored Entity se trata principalmente de cambiar el color de la entidad en el diseñador para que sea fácil para los desarrolladores identificar los grupos de entidades relacionados en el diseñador de Visual Studio. Esta funcionalidad se int...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: primer ejemplo Entity Framework: primer ejemplo

    Entity Framework: primer ejemplo

    • 2020-11-20 04:38:27 | Tutorial de Entit...

    Entity Framework: primer ejemploDefinamos un modelo muy simple usando clases. Simplemente los definimos en el archivo Program. cs, pero en una aplicación real creas una plantillaAgregue las siguientes tres clases al archivo Program. cs utilizando el siguiente código para la clase Student. estudiante...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: anotaciones de datos Entity Framework: anotaciones de datos

    Entity Framework: anotaciones de datos

    • 2020-11-20 04:38:03 | Tutorial de Entit...

    Entity Framework: anotaciones de datosDataAnnotations se usa para configurar clases que resaltarán las configuraciones más comúnmente necesarias. Varias aplicaciones . NET también entienden las anotaciones de datos, como ASP. NET MVC, que permite que estas aplicaciones aprovechen las mismas anotacio...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework - API fluida Entity Framework - API fluida

    Entity Framework - API fluida

    • 2020-11-20 04:37:21 | Tutorial de Entit...

    Entity Framework - API fluidaLa API Fluent es una forma avanzada de especificar la configuración del modelo que cubre todo lo que las anotaciones de datos pueden agregar a una configuración más avanzada que no es posible con las anotaciones de datos. Las anotaciones de datos y la API fluida se puede...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework - Base de datos básica Entity Framework - Base de datos básica

    Entity Framework - Base de datos básica

    • 2020-11-20 04:36:40 | Tutorial de Entit...

    Entity Framework: base de datos inicialEn Entity Framework, Seed se introdujo en EF 4.1 y funciona con inicializadores de base de datos. La idea general de un método de inicialización es inicializar datos en una base de datos creada por Code First o desarrollada por migraciones. Estos datos a menudo...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: varios DbContext Entity Framework: varios DbContext

    Entity Framework: varios DbContext

    • 2020-11-20 04:36:23 | Tutorial de Entit...

    Entity Framework: varios DbContextEn este capítulo, aprenderemos cómo migrar cambios a la base de datos cuando hay varias clases DbContext en la aplicación. Varios DbContext se introdujeron por primera vez en Entity Framework 6.0. Varias clases de contexto pueden pertenecer a una sola base de datos ...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: tipos de entidad anidados Entity Framework: tipos de entidad anidados

    Entity Framework: tipos de entidad anidados

    • 2020-11-20 04:36:08 | Tutorial de Entit...

    Entity Framework: tipos de entidad anidadosAntes de Entity Framework 6, Entity Framework no reconocía entidades anidadas o tipos complejos dentro de otras entidades o tipos complejos. Cuando Entity Framework generó el modelo, los tipos anidados simplemente desaparecieron. Echemos un vistazo a un eje...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: descripción general Entity Framework: descripción general

    Entity Framework: descripción general

    • 2020-11-20 04:21:43 | Tutorial de Entit...

    Entity Framework: descripción general¿Cuál es el marco de la entidad? Entity Framework se lanzó por primera vez en 2008, el principal medio de interacción de Microsoft entre las aplicaciones . NET y las bases de datos relacionales. Entity Framework es un Object Relational Mapper (ORM) que es un tipo...

    • facebook
    • twitter
    • xing
    • linkedin
    Entity Framework: configuración del entorno Entity Framework: configuración del entorno

    Entity Framework: configuración del entorno

    • 2020-11-20 04:21:19 | Tutorial de Entit...

    Entity Framework: configuración del entorno¿Qué hay de nuevo en Entity Framework 6? Framework tiene una API compleja que le permite tener un control granular sobre todo, desde su modelado hasta su comportamiento en tiempo de ejecución. Parte de Entity Framework 5 vive dentro de . NET. Y otra parte e...

    • facebook
    • twitter
    • xing
    • linkedin