Entity Framework ( EF ) es un marco de mapeo relacional de objetos (ORM) de código abierto [2] para ADO.NET . Originalmente se envió como parte integral de .NET Framework , sin embargo, a partir de la versión 6.0 de Entity Framework se ha enviado por separado de .NET Framework.
Entity Framework 6.4 fue la última versión del marco clásico. Aunque Entity Framework 6 todavía recibe soporte, ya no se desarrolla y solo recibirá correcciones para problemas de seguridad. [3]
En 2016 se introdujo un nuevo marco conocido como Entity Framework Core (EF Core) con características similares, pero no completas. [4] La numeración de versiones de este marco se reinició desde 1.0 y la última versión de EF Core es 8.0. [5]
Entity Framework es un conjunto de tecnologías de ADO.NET que respalda el desarrollo de aplicaciones de software orientadas a datos. Los arquitectos y desarrolladores de aplicaciones orientadas a datos generalmente han tenido que luchar con la necesidad de lograr dos objetivos muy diferentes. Deben modelar las entidades, las relaciones y la lógica de los problemas comerciales que están resolviendo, y también deben trabajar con los motores de datos utilizados para almacenar y recuperar los datos. Los datos pueden abarcar múltiples sistemas de almacenamiento, cada uno con sus propios protocolos; incluso las aplicaciones que funcionan con un solo sistema de almacenamiento deben equilibrar los requisitos del sistema de almacenamiento con los requisitos de escribir código de aplicación eficiente y mantenible. Este problema generalmente se conoce como " desajuste de impedancia objeto-relacional ". [6]
Se han desarrollado muchas herramientas de mapeo relacional de objetos (ORM) (también conocidas como "administradores relacionales de objetos") para permitir a los desarrolladores trabajar con datos en forma de objetos y propiedades específicos del dominio, como clientes y direcciones de clientes, sin tener que preocuparse por las tablas y columnas de la base de datos subyacente donde se almacenan estos datos. Con un ORM, los desarrolladores pueden trabajar en un nivel más alto de abstracción cuando tratan con datos, y pueden crear y mantener aplicaciones orientadas a datos con menos código que en las aplicaciones tradicionales. Entity Framework es la solución ORM que actualmente se promociona para su uso dentro de la pila de desarrollo de Microsoft. [7]
La primera versión de Entity Framework (EFv1) se incluyó en .NET Framework 3.5 Service Pack 1 y Visual Studio 2008 Service Pack 1, publicados el 11 de agosto de 2008 . Esta versión fue ampliamente criticada, llegando incluso a recibir un "voto de censura" firmado por al menos mil desarrolladores. [8]
La segunda versión de Entity Framework, denominada Entity Framework 4.0 (EFv4), se lanzó como parte de .NET 4.0 el 12 de abril de 2010 y abordó muchas de las críticas hechas a la versión 1. [9]
Una tercera versión de Entity Framework, la versión 4.1, se lanzó el 12 de abril de 2011, con soporte de Code First.
El 25 de julio de 2011 se lanzó una actualización de la versión 4.1, denominada Entity Framework 4.1 Update 1, que incluye correcciones de errores y nuevos tipos admitidos.
La versión 4.3.1 se lanzó el 29 de febrero de 2012. [10] Hubo algunas actualizaciones, como soporte para la migración.
La versión 5.0.0 se lanzó el 11 de agosto de 2012 [11] y está destinada a .NET Framework 4.5. Además, esta versión está disponible para .Net Framework 4, pero sin ninguna ventaja de tiempo de ejecución con respecto a la versión 4.
La versión 6.0 se lanzó el 17 de octubre de 2013 [12] y ahora es un proyecto de código abierto con licencia Apache v2. Al igual que ASP.NET MVC , su código fuente está alojado en GitHub mediante Git. [13] Esta versión tiene una serie de mejoras para la compatibilidad con el código primero. [14]
Microsoft decidió entonces modernizar, componentizar y llevar .NET multiplataforma a Linux, OSX y otros, lo que significa que la próxima versión de Entity Framework sería una reescritura completa. [15] El 27 de junio de 2016 se lanzó como Entity Framework Core 1.0, junto con ASP.NET Core 1.0 y .NET Core 1.0. [16] Originalmente se llamaba Entity Framework 7, pero se le cambió el nombre para resaltar que era una reescritura completa en lugar de una actualización incremental y que no reemplaza a EF6. [17]
Entity Framework Core 1.0 tiene licencia Apache License v2 y se creó completamente de forma abierta en GitHub. Si bien Entity Framework Core 1.0 comparte algunas similitudes conceptuales con versiones anteriores de Entity Framework, se trataba de una base de código completamente nueva diseñada para ser más eficiente, potente, flexible y extensible, que se ejecutaba en Windows, Linux y OSX y admitía una nueva gama de almacenes de datos relacionales y NoSQL . [15]
Entity Framework Core 2.0 se lanzó el 14 de agosto de 2017
junto con Visual Studio 2017 15.3 y ASP.NET Core 2.0 [18]Entity Framework Core 3.0 se lanzó el 23 de septiembre de 2019
junto con Visual Studio 2019 16.3 y ASP.NET Core 3.0, [19]Entity Framework Core 3.1 (EF Core 3.1) se lanzó formalmente para uso en producción el 3 de diciembre de 2019
y será la versión preferida con soporte a largo plazo hasta al menos el 3 de diciembre de 2022. [20] [21]Entity Framework Core 5.0 (EF Core 5) se lanzó para uso en producción el 9 de noviembre de 2020
. [20] [21] Se retiró y dejó de recibir soporte 1,5 años después, el 10 de mayo de 2022. [22]Entity Framework Core 6.0 (EF Core 6) se lanzó el 10 de noviembre de 2021
[23] [24] y será la versión preferida con soporte a largo plazo hasta al menos el 12 de noviembre de 2024. [25]Entity Framework Core 7.0 (EF Core 7) se lanzó el 8 de noviembre de 2022
[26] [27] y agregó características como columnas JSON y actualizaciones masivas.Entity Framework Core 8.0 (EF Core 8) se lanzó el 14 de noviembre de 2023
[28] [29] y agregó características como objetos de valor que usan tipos complejos y colecciones primitivas.La arquitectura de ADO.NET Entity Framework, de abajo hacia arriba, consta de lo siguiente: [ cita requerida ]
El modelo de datos de entidad ( EDM ) especifica el modelo conceptual (CSDL) de los datos, utilizando una técnica de modelado que se denomina a su vez modelo de datos de entidad, una versión extendida del modelo entidad-relación . [30] El modelo de datos describe principalmente las entidades y las asociaciones en las que participan. El esquema EDM se expresa en el lenguaje de definición de esquema (SDL), que es una aplicación de XML (lenguaje de marcado extendido). Además, también se debe especificar el mapeo (MSL) de los elementos del esquema conceptual (CSDL) al esquema de almacenamiento (SSDL). La especificación del mapeo también se expresa en XML. [31]
Visual Studio también proporciona el Entity Designer para la creación visual del EDM y la especificación de la asignación. Este enfoque se denomina enfoque "Model First", como alternativa a los enfoques "Code First" y "Database First". El resultado de la herramienta es el archivo XML (*.edmx) que especifica el esquema y la asignación. El archivo edmx contiene artefactos de metadatos de EF (contenido CSDL/MSL/SSDL). Estos tres archivos (csdl, msl, ssdl) también se pueden crear o editar a mano. [ cita requerida ] El enfoque "Model First" no será compatible con la versión EF Core. [32]
El Asistente para modelos de datos de entidades [33] de Visual Studio genera inicialmente una asignación uno a uno (1:1) entre el esquema de la base de datos y el esquema conceptual en la mayoría de los casos. En el esquema relacional, los elementos están compuestos por las tablas, y las claves primarias y externas unen las tablas relacionadas. Por el contrario, los tipos de entidad definen el esquema conceptual de los datos. [ cita requerida ]
Los tipos de entidad son una agregación de múltiples campos tipificados (cada campo se asigna a una determinada columna de la base de datos) y pueden contener información de múltiples tablas físicas. Los tipos de entidad pueden estar relacionados entre sí, independientemente de las relaciones en el esquema físico. Las entidades relacionadas también se exponen de manera similar: a través de un campo cuyo nombre denota la relación en la que participan y a la que acceden, que, en lugar de recuperar el valor de alguna columna de la base de datos, recorre la relación y devuelve la entidad (o una colección de entidades) con la que está relacionada. [ cita requerida ]
Los tipos de entidad forman la clase de objetos a los que se ajustan las entidades, siendo las entidades instancias de los tipos de entidad. Las entidades representan objetos individuales que forman parte del problema que resuelve la aplicación y están indexados por una clave. Por ejemplo, al convertir el esquema físico descrito anteriormente, tendremos dos tipos de entidad:
El esquema lógico y su mapeo con el esquema físico se representan como un Modelo de Datos de Entidad (EDM), especificado como un archivo XML. ADO.NET Entity Framework utiliza el EDM para realizar realmente el mapeo, permitiendo que la aplicación trabaje con las entidades, mientras que abstrae internamente el uso de construcciones ADO.NET como DataSet y RecordSet . ADO.NET Entity Framework realiza las uniones necesarias para tener información de referencia de entidad de múltiples tablas, o cuando se recorre una relación. Cuando se actualiza una entidad, rastrea de qué tabla proviene la información y emite instrucciones de actualización SQL para actualizar las tablas en las que se han actualizado algunos datos. ADO.NET Entity Framework utiliza eSQL, un derivado de SQL, para realizar consultas, operaciones de teoría de conjuntos y actualizaciones en entidades y sus relaciones. Las consultas en eSQL, si es necesario, se traducen luego a la versión SQL nativa de la base de datos subyacente. [ cita requerida ]
Los tipos de entidad y los conjuntos de entidades forman el esquema lógico de EDM y pueden exponerse como cualquier cosa. ADO.NET Entity Framework incluye Object Service que presenta estas entidades como objetos con los elementos y relaciones expuestos como propiedades. Por lo tanto, los objetos de entidad son simplemente una interfaz para las instancias de los tipos de entidad de EDM, lo que permite que los lenguajes orientados a objetos accedan a ellos y los utilicen. De manera similar, se pueden crear otras interfaces que exponen las entidades a través de servicios web (por ejemplo, WCF Data Services ) o XML que se utiliza cuando las entidades se serializan para el almacenamiento persistente o la transferencia por cable. [34]
Las entidades** son instancias de EntityType s; representan las instancias individuales de los objetos (como customer , orders ) a los que pertenece la información. La identidad de una entidad está definida por el tipo de entidad del que es una instancia; en ese sentido, un tipo de entidad define la clase a la que pertenece una entidad y también define qué propiedades tendrá una entidad. Las propiedades describen algún aspecto de la entidad al darle un nombre y un tipo. Las propiedades de un tipo de entidad en ADO.NET Entity Framework están completamente tipificadas y son totalmente compatibles con el sistema de tipos utilizado en un sistema DBMS, así como con el Common Type System de .NET Framework. Una propiedad puede ser SimpleType o ComplexType y también puede tener varios valores. Todos los EntityType pertenecen a algún espacio de nombres y tienen una propiedad EntityKey que identifica de forma única cada instancia del tipo de entidad. Los diferentes tipos de propiedad se distinguen de la siguiente manera: [ cita requerida ]
Todas las instancias de entidad se almacenan en EntityContainers, que son contenedores para entidades por proyecto. Cada proyecto tiene uno o más EntityContainers con nombre, que pueden hacer referencia a entidades en múltiples espacios de nombres y tipos de entidad. Se pueden almacenar múltiples instancias de un tipo de entidad en colecciones llamadas EntitySets. Un tipo de entidad puede tener múltiples EntitySets. [ cita requerida ]
Tipos primitivos EDM (tipos simples): [35] [37]
Dos tipos de entidades cualesquiera pueden estar relacionados, ya sea mediante una relación de asociación o una relación de contención . Por ejemplo, un envío que se factura a un cliente es una asociación, mientras que un pedido que contiene detalles del pedido es una relación de contención. Una relación de contención también se puede utilizar para modelar la herencia entre entidades. La relación entre dos tipos de entidades se especifica mediante un tipo de relación , cuyas instancias, llamadas relaciones , relacionan instancias de entidad. En futuras versiones, se pueden introducir otros tipos de relaciones, como composición o identificación . [ cita requerida ]
Los tipos de relación se caracterizan por su grado (aridad) o el número de tipos de entidad que relacionan y su multiplicidad. Sin embargo, en la versión inicial de ADO.NET Entity Framework, las relaciones se limitan a una relación binaria (de grado dos) bidireccional. La multiplicidad define cuántas instancias de entidad se pueden relacionar entre sí. Según la multiplicidad, las relaciones pueden ser de uno a uno, de uno a muchos o de muchos a muchos. Las relaciones entre entidades se nombran; el nombre se denomina Rol. Define el propósito de la relación. [ cita requerida ]
Un tipo de relación también puede tener una Operación o Acción asociada, lo que permite que se realice alguna acción sobre una entidad en caso de que se realice una acción sobre una entidad relacionada. Se puede especificar una relación para que realice una Acción cuando se realiza alguna Operación sobre una entidad relacionada. Por ejemplo, al eliminar una entidad que forma parte de una relación (la operación OnDelete ), las acciones que se pueden realizar son: [38]
Para las relaciones de asociación, que pueden tener semánticas diferentes en cada extremo, se pueden especificar acciones diferentes para cada extremo. [ cita requerida ]
ADO.NET Entity Framework utiliza un lenguaje de definición de datos basado en XML llamado lenguaje de definición de esquema (SDL) para definir el esquema EDM. El SDL define los SimpleTypes de forma similar a los tipos primitivos CTS , incluidos String , Int32 , Double , Decimal , Guid y DateTime , entre otros. Una Enumeration , que define un mapa de valores y nombres primitivos, también se considera un tipo simple. Las enumeraciones solo se admiten a partir de la versión 5.0 del framework. Los ComplexTypes se crean a partir de una agregación de otros tipos. Una colección de propiedades de estos tipos define un Entity Type. Esta definición se puede escribir en la gramática EBNF como: [ cita requerida ]
EntityType :: = ENTITYTYPE entityTypeName [ BASE entityTypeName ] [ ABSTRACT true | false ] KEY propertyName [, propertyName ] * {( propertyName PropertyType [ PropertyFacet ] * ) + }TipoDePropiedad ::= ( ( TipoPrimitivo [ CarasDeTipoPrimitivo ] * ) | ( NombreDeTipoComplejo ) | TipoDeFila PropertyFacet ::= ( [ NULLABLE verdadero | falso ] | [ DEFAULT defaultVal ] | [ MULTIPLICIDAD [ 1 | * ]] ) PropertyTypeFacet ::= MAXLENGTH | PRECISIÓN | ESCALA | UNICODE | LONGITUD FIJA | COLACIÓN | FECHA Y HORA | PRESERVA LOS SEGUNDOS TipoPrimitivo ::= BINARIO | CADENA | BOOLEANO | SIMPLE | DOBLE | DECIMAL | GUID | BYTE | SBYTE | INT16 | INT32 | INT64 | FECHAYHORA | DESVENTAJADETIME | HORA )
Las facetas se utilizan para describir los metadatos de una propiedad, como por ejemplo si es nula o tiene un valor predeterminado, así como la cardinalidad de la propiedad, es decir, si la propiedad tiene un solo valor o varios valores. Una multiplicidad de “1” denota una propiedad con un solo valor; un “*” significa que es una propiedad con varios valores. Como ejemplo, una entidad se puede denotar en SDL como: [39]
<ComplexType Nombre= "Dirección" > <Propiedad Nombre= "Calle" Tipo= "Cadena" Acepta valores NULL= "falso" /> <Propiedad Nombre= "Ciudad" Tipo= "Cadena" Acepta valores NULL= "falso" /> <Propiedad Nombre= "País" Tipo= "Cadena" Acepta valores NULL= "falso" /> <Propiedad Nombre= "Código Postal" Tipo= "Int32" /> </ComplexType> <EntityType Nombre= "Cliente" > <Clave> <PropertyRef Nombre= "Correo electrónico" /> </Clave> <Propiedad Nombre= "Nombre" Tipo= "Cadena" /> <Propiedad Nombre= "Correo electrónico" Tipo= "Cadena" Acepta valores NULL= "falso" /> <Propiedad Nombre= "Dirección" Tipo= "Dirección" /> </EntityType>
Un tipo de relación se define como la especificación de los puntos finales y sus multiplicidades. Por ejemplo, una relación de uno a muchos entre Cliente y Pedidos se puede definir como
< Nombre de asociación= "ClienteYPedidos" > < Tipo final = "Cliente" Multiplicidad= "1" /> < Tipo final = "Pedidos" Multiplicidad= "*" > < AcciónAlEliminar= "Cascada" /> </Fin> </Asociación>
ADO.NET Entity Framework utiliza una variante del lenguaje de consulta estructurado , denominada Entity SQL , cuyo objetivo es escribir consultas declarativas y actualizaciones sobre entidades y relaciones entre entidades, a nivel conceptual. Se diferencia de SQL en que no tiene construcciones explícitas para uniones , ya que el lenguaje de consulta estructurado está diseñado para abstraer la partición de datos entre tablas. [ cita requerida ]
Las consultas sobre el modelo conceptual se facilitan mediante las clases EntityClient , que aceptan una consulta Entity SQL. La secuencia de consultas analiza la consulta Entity SQL en un árbol de comandos, separando la consulta en varias tablas, que se entregan al proveedor EntityClient. Al igual que los proveedores de datos de ADO.NET, un proveedor EntityClient también se inicializa utilizando un objeto Connection , que además de los parámetros habituales de almacén de datos e información de autenticación, requiere el esquema SDL y la información de mapeo. El proveedor EntityClient, a su vez, convierte el árbol de comandos Entity SQL en una consulta SQL en el formato nativo de la base de datos. La ejecución de la consulta luego devuelve un ResultSet de Entity SQL, que no está limitado a una estructura tabular, a diferencia de los ResultSets de ADO.NET. [ cita requerida ]
Entity SQL mejora SQL al agregar soporte intrínseco para: [ cita requerida ]
Las funciones canónicas son compatibles con todos los proveedores de datos compatibles con Entity Framework. Se pueden utilizar en una consulta de Entity SQL. Además, la mayoría de los métodos de extensión en LINQ to Entities se traducen a funciones canónicas. Son independientes de cualquier base de datos específica. Cuando el proveedor de datos de ADO.NET recibe una función, la traduce a la declaración SQL deseada. [40]
Pero no todos los DBMS tienen una funcionalidad equivalente y un conjunto de funciones integradas estándar. También existen diferencias en la precisión de los cálculos. Por lo tanto, no todas las funciones canónicas son compatibles con todas las bases de datos y no todas ellas devuelven los mismos resultados. [ cita requerida ]
El proveedor LINQ to Entities permite utilizar LINQ para consultar varias fuentes de datos RDBMS . Hay disponibles varios proveedores específicos de servidores de bases de datos compatibles con Entity Framework. [ cita requerida ]
En Entity Framework v4 se agregaron los nuevos métodos ExecuteStoreQuery() y ExecuteStoreCommand() a la clase ObjectContext. [ cita requerida ]
Visual Studio tiene una función llamada Visualizador. Una consulta LINQ escrita en Visual Studio se puede ver como SQL nativo mediante un visualizador durante la sesión de depuración. En Visual Studio Marketplace hay disponible un visualizador para LINQ to Entities (Object Query) dirigido a todos los RDBMS. [41]
Hay varios perfiladores disponibles comercialmente para solucionar problemas de rendimiento utilizando Entity Framework, tanto para las variantes EF como para las EF Core.
Hay herramientas y extensiones de Entity Framework Core disponibles para mejorar el rendimiento de Entity Framework Core. [42]
Hay herramientas y extensiones de Entity Framework disponibles para mejorar el rendimiento de Entity Framework. [43]