Portabilidad de EF6 a EF CorePorting from EF6 to EF Core

Debido a los cambios fundamentales en EF Core, no se recomienda que intente mover una aplicación de EF6 a EF Core, salvo que tenga una razón convincente para hacerlo.Because of the fundamental changes in EF Core we do not recommend attempting to move an EF6 application to EF Core unless you have a compelling reason to make the change. Debe ver la migración de EF6 a EF Core como una portabilidad en lugar de una actualización.You should view the move from EF6 to EF Core as a port rather than an upgrade.

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.Before you start the porting process it is important to validate that EF Core meets the data access requirements for your application.

Características que faltanMissing features

Asegúrese de que EF Core tenga todas las características que necesita para usar en la aplicación.Make sure that EF Core has all the features you need to use in your application. Vea Comparación de características para obtener una comparación detallada del conjunto de características entre EF Core y EF6.See Feature Comparison for a detailed comparison of how the feature set in EF Core compares to EF6. Si faltan algunas características necesarias, asegúrese de que puede compensar la falta de estas características antes de portar a EF Core.If any required features are missing, ensure that you can compensate for the lack of these features before porting to EF Core.

Cambios de comportamientoBehavior changes

Se trata de una lista no exhaustiva de algunos cambios de comportamiento entre EF6 y EF Core.This is a non-exhaustive list of some changes in behavior between EF6 and EF Core. Es importante tener esto en cuenta cuando porte la aplicación, ya que pueden cambiar la forma en que se comporta la aplicación, pero no se mostrarán como errores de compilación después de cambiar a EF Core.It is important to keep these in mind as your port your application as they may change the way your application behaves, but will not show up as compilation errors after swapping to EF Core.

DbSet.Add/Attach y comportamiento del grafoDbSet.Add/Attach and graph behavior

En EF6, llamar DbSet.Add() en una entidad provoca una búsqueda recursiva de todas las entidades a las que se hace referencia en sus propiedades de navegación.In EF6, calling DbSet.Add() on an entity results in a recursive search for all entities referenced in its navigation properties. Las entidades que se encuentran, y a las que el contexto todavía no ha realizado un seguimiento, también se marcarán como agregadas.Any entities that are found, and are not already tracked by the context, are also marked as added. DbSet.Attach() se comporta de la misma forma, salvo que todas las entidades se marcan como sin cambios.DbSet.Attach() behaves the same, except all entities are marked as unchanged.

EF Core realiza una búsqueda recursiva similar, pero con algunas reglas ligeramente diferentes.EF Core performs a similar recursive search, but with some slightly different rules.

  • La entidad raíz siempre está en el estado de solicitada (agregada para DbSet.Add y sin cambios para DbSet.Attach).The root entity is always in the requested state (added for DbSet.Add and unchanged for DbSet.Attach).

  • Para las entidades que se encuentran durante la búsqueda recursiva de propiedades de navegación:For entities that are found during the recursive search of navigation properties:

    • Si la clave principal de la entidad se genera en el almacénIf the primary key of the entity is store generated

      • Si la clave principal no se establece en un valor, el estado se establece en agregada.If the primary key is not set to a value, the state is set to added. El valor de la clave principal se considera "no establecido" si se le asigna el valor predeterminado de CLR para el tipo de propiedad (por ejemplo, 0 para int, null para string, etc.).The primary key value is considered "not set" if it is assigned the CLR default value for the property type (for example, 0 for int, null for string, etc.).

      • Si la clave principal no se establece en un valor, el estado se establece en sin cambios.If the primary key is set to a value, the state is set to unchanged.

    • Si la clave principal no se genera en la base de datos, la entidad se coloca en el mismo estado que la raíz.If the primary key is not database generated, the entity is put in the same state as the root.

Inicialización de la base de datos de Code FirstCode First database initialization

EF6 tiene cierta magia en torno a la selección de la conexión de base de datos y la inicialización de la base de datos. Algunas de estas reglas incluyen:EF6 has a significant amount of magic it performs around selecting the database connection and initializing the database. Some of these rules include:

  • Si no se realiza ninguna configuración, EF6 seleccionará una base de datos en SQL Express o LocalDb.If no configuration is performed, EF6 will select a database on SQL Express or LocalDb.

  • Si una cadena de conexión con el mismo nombre que el contexto está en el archivo App/Web.config de las aplicaciones, se usará esta conexión.If a connection string with the same name as the context is in the applications App/Web.config file, this connection will be used.

  • Si la base de datos no existe, se creará.If the database does not exist, it is created.

  • Si no existe ninguna de las tablas del modelo en la base de datos, el esquema del modelo actual se agrega a la base de datos.If none of the tables from the model exist in the database, the schema for the current model is added to the database. Si se habilitan las migraciones, se usan para crear la base de datos.If migrations are enabled, then they are used to create the database.

  • Si la base de datos existe y EF6 ha creado previamente el esquema, entonces se comprueba la compatibilidad de dicho esquema con el modelo actual.If the database exists and EF6 had previously created the schema, then the schema is checked for compatibility with the current model. Se inicia una excepción si el modelo ha cambiado desde que se creó el esquema.An exception is thrown if the model has changed since the schema was created.

EF Core no lleva a cabo nada de esta magia.EF Core does not perform any of this magic.

  • La conexión de base de datos debe estar explícitamente configurada en el código.The database connection must be explicitly configured in code.

  • No se realiza ninguna inicialización.No initialization is performed. Debe usar DbContext.Database.Migrate() para aplicar las migraciones (o DbContext.Database.EnsureCreated() y EnsureDeleted() para crear o eliminar la base de datos sin usar migraciones).You must use DbContext.Database.Migrate() to apply migrations (or DbContext.Database.EnsureCreated() and EnsureDeleted() to create/delete the database without using migrations).

Convención de nomenclatura de tablas de Code FirstCode First table naming convention

EF6 ejecuta el nombre de clase de entidad a través de un servicio de pluralización para calcular el nombre de tabla predeterminado al que está asignada la entidad.EF6 runs the entity class name through a pluralization service to calculate the default table name that the entity is mapped to.

EF Core usa el nombre de la propiedad DbSet en la que se expone la entidad en el contexto derivado.EF Core uses the name of the DbSet property that the entity is exposed in on the derived context. Si la entidad no tiene una propiedad DbSet, se utiliza el nombre de clase.If the entity does not have a DbSet property, then the class name is used.