Cambios de comportamiento entre EF6 y EF Core

Esta es una lista no exhaustiva de cambios en el comportamiento entre EF6 y EF Core. Es importante tener en cuenta estos aspectos al trasladar la aplicación, ya que pueden cambiar su comportamiento, pero no se mostrarán como errores de compilación después de cambiar a EF Core.

Esto está pensado como una revisión de alto nivel que se debe tener en cuenta como parte del proceso de portabilidad. Para obtener instrucciones más detalladas y específicas, lea los casos detallados.

Comportamiento de DbSet.Add/Attach y gráfico

En EF6, llamar a DbSet.Add() en una entidad da como resultado una búsqueda recursiva de todas las entidades a las que se hace referencia en sus propiedades de navegación. Las entidades que se encuentran y que aún no son rastreadas por el contexto, también se marcan como agregadas. DbSet.Attach() se comporta igual, excepto que todas las entidades se marcan como sin cambios.

EF Core realiza una búsqueda recursiva similar, pero con algunas reglas ligeramente diferentes.

  • Si la entidad raíz está configurada para una clave generada y la clave no está establecida, pasará al estado Added.
  • Para las entidades que se encuentran durante la búsqueda recursiva de propiedades de navegación:
    • Si se genera la clave principal de la entidad
      • Si la clave principal no está establecida en un valor, el estado se establece en agregado. El valor de clave principal se considera "no establecido" si se le asigna el valor predeterminado clR para el tipo de propiedad (por ejemplo, 0 para , int para nullstring, etc.).
      • Si la clave principal se establece en un valor, el estado se establece en sin cambios.
    • Si la clave principal no se genera en la base de datos, la entidad se coloca en el mismo estado que la raíz.
  • Este cambio de comportamiento solo se aplica a los Attach grupos de métodos y Update . Add siempre coloca entidades en el Added estado, incluso si se establece la clave.
  • Attach los métodos colocan entidades con claves definidas en el Unchanged estado. Esto facilita "insertarlo si es nuevo; de lo contrario, déjelo solo". Update los métodos colocan entidades con claves establecidas en el Modified estado . Esto facilita "insertarlo si es nuevo; de lo contrario, actualícelo".

La filosofía general aquí es que Update es una manera muy sencilla de controlar inserciones y actualizaciones de entidades desconectadas. Garantiza que se insertan las entidades nuevas y se actualizan las entidades existentes.

Al mismo tiempo, Add todavía proporciona una manera sencilla de forzar la inserción de entidades. Agregar solo es útil cuando no se usan claves generadas automáticamente, de modo que EF no sabe si la entidad es nueva o no.

Para obtener más información sobre estos comportamientos en EF Core, lea Change Tracking en EF Core.

Inicialización de la base de datos de Code First

EF6 tiene una cantidad significativa de magia que realiza para seleccionar la conexión de la base de datos e inicializar la base de datos. Algunas de estas reglas incluyen:

  • Si no se realiza ninguna configuración, EF6 seleccionará una base de datos en SQL Express o LocalDb.
  • Si una cadena de conexión con el mismo nombre que el contexto está en el archivo de App/Web.config la aplicación, se usará esta conexión.
  • Si la base de datos no existe, se crea.
  • Si ninguna de las tablas del modelo existe en la base de datos, el esquema del modelo actual se agrega a la base de datos. Si las migraciones están habilitadas, se usan para crear la base de datos.
  • Si la base de datos existe y EF6 ha creado previamente el esquema, se comprueba si el esquema es compatible con el modelo actual. Se produce una excepción si el modelo ha cambiado desde que se creó el esquema.

EF Core no realiza ninguna de esta magia.

  • La conexión de base de datos debe configurarse explícitamente en el código.
  • No se realiza ninguna inicialización. Debe usar DbContext.Database.Migrate() para aplicar migraciones (o DbContext.Database.EnsureCreated() y EnsureDeleted() para crear y eliminar la base de datos sin usar migraciones).

Convención de nomenclatura de tablas de Code First

EF6 pasa el nombre de la clase de entidad por un servicio de pluralización con el fin de calcular el nombre predeterminado de la tabla a la que se mapea la entidad.

EF Core utiliza el nombre de la propiedad DbSet en la que la entidad se expone dentro del contexto derivado. Si la entidad no tiene una DbSet propiedad, se usa el nombre de clase.

Para obtener más información, consulte Administración de esquemas de base de datos.