Cambios de comportamiento entre EF6 y EF Core
Se trata de una lista no exhaustiva de cambios de comportamiento entre EF6 y 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.
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 de mayúsculas y minúsculas más detalladas, lea los casos detallados.
DbSet.Add/Attach y comportamiento del grafo
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. 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. DbSet.Attach()
se comporta de la misma forma, salvo 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, se colocará en el estado
Added
. - Para las entidades que se encuentran durante la búsqueda recursiva de propiedades de navegación:
- Si la clave principal de la entidad se genera en el almacén
- Si la clave principal no se establece en un valor, el estado se establece en agregada. 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
paraint
,null
parastring
, etc.). - Si la clave principal no se establece en un valor, el estado se establece en sin cambios.
- Si la clave principal no se establece en un valor, el estado se establece en agregada. 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,
- Si la clave principal no se genera en la base de datos, la entidad se coloca en el mismo estado que la raíz.
- Si la clave principal de la entidad se genera en el almacén
- Este cambio de comportamiento solo se aplica a los grupos de métodos
Attach
yUpdate
.Add
siempre coloca entidades en el estadoAdded
, incluso si se establece la clave. - Los métodos
Attach
colocan entidades con claves establecidas en el estadoUnchanged
. Esto facilita "insertarlo si es nuevo; de lo contrario, dejarlo solo". Los métodosUpdate
colocan entidades con claves establecidas en el estadoModified
. Esto facilita "insertarlo si es nuevo; de lo contrario, actualízarlo".
La filosofía general 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 solo cuando no se usan claves generadas por el almacén, 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 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:
- 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
App/Web.config
de la aplicación, se usará esta conexión. - Si la base de datos no existe, se creará.
- 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. Si se habilitan las migraciones, se usan para crear la base de datos.
- 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. Se inicia una excepción si el modelo ha cambiado desde que se creó el esquema.
EF Core no lleva a cabo nada de esta magia.
- La conexión de base de datos debe estar explícitamente configurada en el código.
- No se realiza ninguna inicialización. Debe usar
DbContext.Database.Migrate()
para aplicar las migraciones (oDbContext.Database.EnsureCreated()
yEnsureDeleted()
para crear o eliminar la base de datos sin usar migraciones).
Convención de nomenclatura de tablas de Code First
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.
EF Core usa el nombre de la propiedad DbSet
en la que se expone la entidad en el contexto derivado. Si la entidad no tiene una propiedad DbSet
, se utiliza el nombre de clase.
Para obtener más información, consulte Administración de esquemas de base de datos.