Compartir a través de


Casos detallados para migrar de EF6 a EF Core

En este documento se detallan algunas diferencias específicas entre EF6 y EF Core. Consulte esta guía al migrar el código.

Configuración de la conexión de base de datos

Hay varias diferencias entre la forma en que EF6 se conecta a varios orígenes de datos en comparación con EF Core. Estas son importantes para comprender cuándo migrar el código.

  • Cadenas de conexión: EF Core no admite directamente varias sobrecargas de constructor para diferentes cadenas de conexión, como hace EF6. En su lugar, se basa en DbContextOptions. Todavía puede proporcionar varias sobrecargas de constructor en tipos derivados, pero tendrá que asignar conexiones a través de las opciones.
  • Configuración y caché: EF Core admite una implementación más sólida y flexible de la inserción de dependencias con una infraestructura interna que puede conectarse a proveedores de servicios externos. La aplicación puede administrar esto para controlar situaciones en las que se deben vaciar las memorias caché. La versión de EF6 estaba limitada y no se pudo vaciar.
  • Archivos de configuración: EF6 admite la configuración a través de archivos de configuración que se pueden incluir el proveedor. EF Core requiere una referencia directa al ensamblado del proveedor y al registro explícito del proveedor (es decir, UseSqlServer).
  • Factorías de conexión: EF6 admite factorías de conexión. EF Core no admite generadores de conexiones y siempre requiere una cadena de conexión.
  • Registro: en general, el registro en EF Core es mucho más sólido y tiene varias opciones para la configuración ajustada.

Convenciones

Convenciones personalizadas ("ligeras") compatibles con EF6 y convenciones de modelo. Las convenciones ligeras son similares a la configuración del modelo anterior a la convención de EF Core. Otras convenciones se admiten como parte de la creación de modelos.

EF6 ejecuta convenciones después de compilar el modelo. EF Core las aplica a medida que se compila el modelo. En EF Core, puede desacoplar la creación de modelos de sesiones activas con DbContext. Es posible crear un modelo inicializado con las convenciones.

Validación de datos

EF Core no admite la validación de datos y solo usa anotaciones de datos para compilar el modelo y las migraciones. La mayoría de las bibliotecas cliente de web/MVC a WinForms y WPF proporcionan una implementación de validación de datos que se va a usar.

Próximas características

Hay algunas características de EF6 que aún no existen en EF Core, pero están en la hoja de ruta del producto.

  • Tabla por tipo concreto (TPC) se admite en EF6 junto con la "división de entidades". TPC está en la hoja de ruta para EF7.
  • La Asignación de procedimientos almacenados en EF6 permite delegar operaciones de creación, actualización y eliminación en procedimientos almacenados. EF Core actualmente solo permite la asignación a procedimientos almacenados para lecturas. La compatibilidad con creación, actualización y eliminación (CUD) está en la hoja de ruta de EF7.
  • Los Tipos complejos en EF6 son similares a los tipos de propiedad de EF Core. Sin embargo, el conjunto completo de funcionalidades se abordará con objetos de valor en EF7.

Deje ObjectContext

EF Core usa un DbContext en lugar de un ObjectContext. Tendrá que actualizar el código que usa IObjectContextAdapter. A veces se usó para las consultas con PreserveChanges o la opción de combinación OverwriteChanges. Para obtener funcionalidades similares en EF Core, examine el método Recargar.

Configuración del modelo

Hay muchas diferencias importantes entre cómo se diseñan los modelos de EF6 y EF Core. EF Core carece de compatibilidad completa con la asignación condicional. No tiene versiones del generador de modelos.

Otras diferencias son:

Detección de tipos

En EF Core, el motor detecta tipos de entidad de tres maneras:

  • Exponga un DbSet<TEntity> en el DbContext en el que TEntity sea el tipo del que desea realizar el seguimiento.
  • Haga referencia a un Set<TEntity> desde algún lugar del código.
  • Los tipos complejos a los que hacen referencia los tipos detectados se detectan de forma recursiva (por ejemplo, si el Blog hace referencia a un Post y Blog se puede detectar, Post también se detectará).

Los ensamblados no se examinan para los tipos derivados.

Asignación

La extensión .Map() en EF6 se ha reemplazado por sobrecargas y métodos de extensión en EF Core. Por ejemplo, puede usar '.HasDiscriminator()' para configurar la tabla por jerarquía (TPH). Consulte: Modelado de la herencia.

Asignación de la herencia

EF6 admite tabla por jerarquía (TPH), tabla por tipo (TPT) y tabla por clase concreta (TPC) y la asignación híbrida habilitada de diferentes tipos en distintos niveles de la jerarquía. EF Core seguirá necesitando una cadena de herencia para el modelado unidireccional (TPT o TPH) y el plan es agregar compatibilidad con TPC en EF7.

Consulte: Modelado de la herencia.

Atributos

Atributos de índice admitidos por EF6 en las propiedades. En EF Core, se aplican en el nivel de tipo, lo que debería facilitar los escenarios que requieren índices compuestos. EF Core no admite claves compuestas con anotaciones de datos (es decir, usar Order in ColumnAttribute junto con KeyAttribute).

Para obtener más información, vea: Índices y restricciones.

Obligatorio y opcional

En la compilación de modelos de EF Core, IsRequired solo configura lo que es necesario en el extremo de la entidad de seguridad. HasForeignKey ahora configura el extremo de la entidad de seguridad. Para migrar el código, será más sencillo usar .Navigation().IsRequired() en su lugar. Por ejemplo:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

De forma predeterminada, todo es opcional, por lo que normalmente no es necesario llamar a .IsRequired(false).

Soporte espacial

EF Core se integra con la biblioteca de la comunidad de bibliotecas de terceros NetTopologySuite para proporcionar compatibilidad espacial.

Asociaciones independientes

EF Core no admite asociaciones independientes (un concepto de EDM que permite definir la relación entre dos entidades independientemente de las propias entidades). Un concepto similar admitido en EF Core es propiedades de sombra propiedad reemplazada.

Migraciones

EF Core no admite inicializadores de base de datos ni migraciones automáticas. Aunque no hay ningún migrate.exe en EF Core, puede generar conjuntos de migración.

Herramientas de Visual Studio

EF Core no tiene ningún diseñador, ninguna funcionalidad para actualizar el modelo de la base de datos y ningún flujo primero del modelo. No hay ningún asistente de ingeniería inversa y ninguna plantilla integrada.

Aunque estas características no se incluyen con EF Core, hay proyectos de la comunidad del sistema operativo que proporcionan herramientas adicionales. En concreto, EF Core Power Tools proporciona:

  • Ingeniería inversa desde Visual Studio con compatibilidad con proyectos de base de datos (.dacpac). Incluye personalizaciones de código basadas en plantillas.
  • Inspección visual de DbContext con grafos y scripting de modelos.
  • Administración de migraciones desde Visual Studio mediante una GUI.

Para obtener una lista completa de las herramientas y extensiones de la comunidad, consulte: Herramientas y extensiones de EF Core.

Seguimiento de cambios

Hay varias diferencias entre cómo EF6 y EF Core tratan el seguimiento de cambios. Estas se resumen en la tabla siguiente:

Característica EF6 EF Core
Estado de la entidad Agrega o adjunta todo el grafo Admite las navegaciones a entidades desasociadas
Huérfanos Conservado Deleted
Entidades desconectadas y de seguimiento automático Compatible No compatible
Mutaciones Realizado en propiedades Realizado en campos de respaldo*
Enlace de datos .Local .Local más .ToObservableCollection o .ToBindingList
Detección de cambios Gráfico completo Por entidad

* De forma predeterminada, la notificación de propiedades no se desencadenará en EF Core, por lo que es importante configurar las entidades de notificación.

Tenga en cuenta que EF Core no llama a la detección de cambios automáticamente con tanta frecuencia como EF6.

EF Core presenta un DebugView detallado para el seguimiento de cambios. Para obtener más información, lea Depuración de Change Tracker.

Consultas

EF6 tiene algunas funcionalidades de consulta que no existen en EF Core. Entre ellas se incluyen las siguientes:

  • Algunas asignaciones comunes de funciones de C# y de funciones SQL.
  • Interceptación del árbol de comandos para consultas y actualizaciones.
  • Compatibilidad con parámetros con valores de tabla (TVP).

EF6 tiene compatibilidad integrada con servidores proxy de carga diferida. Se trata de un paquete de participación para EF Core (consulte Carga diferida de datos relacionados).

EF Core permite componer SQL sin procesar mediante FromSQL.