Portabilidad de EF6 a EF Core

Entity Framework Core, o EF Core, es una reescritura total de Entity Framework para arquitecturas de aplicaciones modernas. Como se han realizado cambios fundamentales, no hay ninguna ruta de acceso directa para la actualización. El objetivo de esta documentación es proporcionar una guía de un extremo a otro para portar aplicaciones de EF6 a EF Core.

Importante

Antes de comenzar el proceso de portabilidad, es importante validar que EF Core cumple los requisitos de acceso a los datos de la aplicación. Encontrará todo lo que necesita en la documentación de EF Core.

Importante

Existe un problema conocido (microsoft/dotnet-apiport #993) con el analizador de portabilidad, que notifica de forma errónea que EF Core no es compatible con .NET 5 ni .NET 6. Estas advertencias se pueden ignorar de forma segura, ya que EF Core es 100 % compatible con las plataformas de destino de .NET 5 y .NET 6.

Motivos para la actualización

La totalidad del desarrollo del nuevo Entity Framework se está llevando a cabo en EF Core. No hay ningún plan para efectuar la portabilidad con versiones anteriores de nuevas características a EF6. EF Core se ejecuta en los entornos de ejecución de .NET más recientes y aprovecha al máximo las características del entorno, las específicas de la plataforma (como ASP.NET Core o WPF) y las específicas del lenguaje. Estas son algunas de las ventajas que obtendrá con la actualización:

  • Podrá aprovechar las mejoras de rendimiento continuas en EF Core. Por ejemplo, un cliente que haya migrado de EF6 a EF Core 6 habrá visto una reducción del uso 40 veces inferior en una consulta pesada debido a la característica de división de consultas. Muchos clientes informan de que han visto mejoras muy significativas en el rendimiento simplemente pasando a la versión más reciente de EF Core.
  • Use las nuevas características en EF Core. No se agregarán nuevas características a EF6. Las nuevas funcionalidades, como el proveedor de Azure Cosmos DB y DbContextFactory, solo se agregarán a EF Core. Para ver una comparación completa entre EF6 y EF Core, incluidas nuevas características exclusivas de EF Core, vea Comparación de EF Core y EF6.
  • Modernice su pila de aplicaciones insertando dependencias e integre perfectamente el acceso a los datos con tecnologías como gRPC y GraphQL.

Nota sobre las migraciones

En esta documentación se utilizan los términos portabilidad y actualización para evitar la confusión con el término migraciones como característica de EF Core. Las migraciones en EF Core no son compatibles con las migraciones Code First de EF6 debido a mejoras significativas en cuanto a la forma de controlar las migraciones. No existe un enfoque recomendado para efectuar la portabilidad del historial de migraciones, por lo que en EF Core verá un nuevo comienzo. Puede conservar el código base y los datos de sus migraciones de EF6. Aplique la migración final en EF6 y, después, cree una migración inicial en EF Core. A partir de ahora, tendrá la posibilidad de supervisar el historial en EF Core.

Pasos de actualización

La ruta de acceso para la actualización se ha dividido en varios documentos organizados por la fase de la actualización y el tipo de aplicación.

Determinación del tipo de EF Core

Existen varios enfoques en cuanto al funcionamiento de EF Core con su modelo de dominio y su implementación de base de datos. En general, la mayoría de las aplicaciones seguirán uno de estos patrones, y el enfoque que aplique a su portabilidad dependerá del tipo de aplicación.

El código como origen de la verdad es un enfoque en el que todo se modela mediante código y clases, a través de atributos de datos, una configuración fluida o una combinación de ambos. La base de datos se genera inicialmente a partir del modelo definido en EF Core, y las siguientes actualizaciones se controlarán normalmente mediante migraciones. Este proceso se suele conocer como Code First (primero el código), pero el nombre no es completamente preciso, porque un enfoque consiste en empezar con una base de datos existente, generar las entidades y, después, mantenerla con código en el futuro.

El enfoque de base de datos como origen de la verdad incluye ingeniería inversa o scaffolding del código desde la base de datos. Cuando se realizan cambios en un esquema, el código se vuelve a generar o se actualiza para reflejar los cambios. Esto se suele denominar "Database First" (primero la base de datos).

Por último, con un enfoque más avanzado de asignación híbrida se sigue la filosofía de que el código y la base de datos se administran por separado, y EF Core se utiliza para efectuar una asignación entre los dos. Con este enfoque, se suelen evitar las migraciones.

En la tabla siguiente se resumen una serie de diferencias de alto nivel:

Enfoque Rol de desarrollador Rol de DBA Migraciones Scaffolding Repo
Code First Diseño de entidades y verificación o personalización de migraciones generadas Comprobación de definiciones y cambios de esquema Por confirmación N/D Seguimiento de entidades, DbContext y migraciones
Database First Inversión de ingeniería después de los cambios y verificación de las entidades generadas Notificación a los desarrolladores cuando la base de datos cambie para volver a crear el scaffolding N/D Cambio por esquema Seguimiento de extensiones o clases parciales que extienden las entidades generadas
Híbrido Actualización de la configuración fluida para asignar cuando una entidad o una base de datos cambie Notificación a los desarrolladores de cuando ha cambiado la base de datos para que puedan actualizar las entidades y la configuración de modelos N/D N/D Seguimiento de entidades y DbContext

El enfoque híbrido es un enfoque más avanzado con sobrecarga adicional en comparación con los enfoques tradicionales de código y base de datos.

Comprensión del impacto de abandonar EDMX

EF6 era compatible con una definición de modelo especial llamada XML de Entity Data Model (EDMX). Los archivos EDMX contienen varias definiciones, incluidas definiciones de esquema conceptual (CSDL), especificaciones de asignación (MSL) y definiciones de esquema de almacenamiento (SSDL). EF Core supervisa los esquemas de dominio, asignación y base de datos mediante gráficos de modelos internos y no es compatible con el formato EDMX. Muchos artículos y entradas de blog indican erróneamente que esto significa que EF Core solo es compatible con "Code First". EF Core es compatible con los tres modelos de aplicación descritos en la sección anterior. Puede recompilar el modelo en EF Core aplicando ingeniería inversa a la base de datos. Si usa EDMX para una representación visual del modelo de entidad, considere la posibilidad de usar el código abierto EF Core Power Tools que proporciona características similares a EF Core.

Para obtener más información sobre el impacto de la falta de compatibilidad con archivos EDMX, lea la guía sobre portabilidad de EDMX.

Realización de los pasos de actualización

No es necesario hacer la portabilidad de toda la aplicación. EF6 y EF Core se pueden ejecutar en la misma aplicación (vea: Uso de EF Core y EF6 en la misma aplicación). Para minimizar el riesgo, debería tener en cuenta lo siguiente:

  1. Si aún no lo ha hecho, pase a EF6 en .NET Core.
  2. Migre una pequeña parte de su aplicación a EF Core y ejecútela en paralelo con EF6.
  3. Finalmente, lleve el resto del código base a EF Core y retire el código de EF6.

En cuanto a la portabilidad en sí, en un nivel alto, hará lo siguiente:

  1. Revisar los cambios de comportamiento entre EF6 y EF Core.
  2. Llevar a cabo las migraciones finales, si hay, en EF6.
  3. Crear su proyecto de EF Core.
  4. Copiar el código al nuevo proyecto, ejecutar ingeniería inversa o una combinación de los dos.
  5. Cambiar el nombre de las referencias y la entidades y actualizar los comportamientos:
    • System.Data.Entity a Microsoft.EntityFrameworkCore
    • Cambio del constructor DbContext para consumir opciones o invalidar OnConfiguring
    • DbModelBuilder a ModelBuilder
    • Cambio del nombre de DbEntityEntry<T> a EntityEntry<T>
    • Movimiento a API de Database.Log a Microsoft.Extensions.Logging (avanzado) o DbContextOptionsBuilder.LogTo (simple)
    • Aplicación de cambios para WithRequired y WithOptional (consulte este vínculo)
    • Actualización del código de validación. No hay ninguna validación de datos integrada en EF Core, pero puede hacerlo manualmente.
    • Siga los pasos necesarios para efectuar la portabilidad de EDMX.
  6. Realización de pasos específicos basados en su enfoque de EF Core:

Hay muchas consideraciones relacionadas con todos los enfoques, así que es recomendable que solo examine las formas de abordar y trabajar en las diferencias detalladas entre EF6 y EF Core.