Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El proveedor de SQLite tiene varias limitaciones de migraciones. La mayoría de estas limitaciones son el resultado de las limitaciones del motor de base de datos de SQLite subyacente y no son específicas de EF.
Limitaciones del modelado
La biblioteca relacional común (compartida por los proveedores de bases de datos relacionales de EF Core) define las API para los conceptos de modelado que son comunes a la mayoría de los motores de base de datos relacionales. El proveedor de SQLite no admite un par de estos conceptos.
- Esquemas
- Secuencias
- Tokens de simultaneidad generados por la base de datos (consulte la documentación)
Limitaciones de las consultas
SQLite no admite de forma nativa los siguientes tipos de datos. EF Core puede leer y escribir valores de estos tipos y también admite consultas por igualdad (where e.Property == value). Sin embargo, otras operaciones, como la comparación y la ordenación, requerirán evaluación en el cliente.
DateTimeOffsetdecimalTimeSpanulong
En lugar de DateTimeOffset, se recomienda usar valores DateTime. Al controlar varias zonas horarias, se recomienda convertir los valores a UTC antes de guardar y, a continuación, volver a convertir a la zona horaria adecuada.
El tipo decimal proporciona un alto nivel de precisión. Sin embargo, si no necesita ese nivel de precisión, se recomienda usar double en su lugar. Puede usar un convertidor de valores de para seguir usando decimal en sus clases.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Limitaciones de las migraciones
El motor de base de datos de SQLite no admite una serie de operaciones de esquema compatibles con la mayoría de otras bases de datos relacionales. Si intenta aplicar una de las operaciones no admitidas a una base de datos de SQLite, se producirá una excepción NotSupportedException.
Se intentará una reconstrucción para realizar determinadas operaciones. Las reconstrucciones solo son posibles para los artefactos de base de datos que forman parte de tu modelo de EF Core. Si un artefacto de base de datos no forma parte del modelo (por ejemplo, si se creó manualmente dentro de una migración), se sigue produciendo un NotSupportedException.
| Operación | ¿Está soportado? |
|---|---|
| AddCheckConstraint | ✔ (reconstruir) |
| AñadirColumna | ✔ |
| AddForeignKey | ✔ (reconstruir) |
| AddPrimaryKey | ✔ (reconstruir) |
| AddUniqueConstraint | ✔ (reconstruir) |
| AlterColumn | ✔ (reconstruir) |
| CrearÍndice | ✔ |
| CreateTable | ✔ |
| EliminarRestricciónDeVerificación | ✔ (reconstruir) |
| DropColumn | ✔ (reconstruir) |
| DropForeignKey | ✔ (reconstruir) |
| EliminarÍndice | ✔ |
| DropPrimaryKey | ✔ (reconstruir) |
| DropTable | ✔ |
| EliminarRestricciónÚnica | ✔ (reconstruir) |
| RenameColumn | ✔ |
| RenameIndex | ✔ (reconstruir) |
| RenameTable | ✔ |
| EnsureSchema | ✔ (no-op) |
| DropSchema | ✔ (no-op) |
| Insertar | ✔ |
| Actualizar | ✔ |
| Eliminar | ✔ |
Solución a las limitaciones de las migraciones
Puede solucionar algunas de estas limitaciones escribiendo manualmente código en las migraciones para realizar una recompilación. Las recompilaciones de tablas implican crear una nueva tabla, copiar datos en la nueva tabla, quitar la tabla antigua y cambiar el nombre de la nueva tabla. Deberá usar el método Sql para realizar algunos de estos pasos.
Consulte Realizar otros tipos de cambios de esquema de tabla en la documentación de SQLite para obtener más detalles.
Limitaciones del script Idempotent
A diferencia de otras bases de datos, SQLite no incluye un lenguaje de procedimientos. Debido a esto, no hay ninguna manera de generar la lógica if-then requerida por los scripts de migración idempotentes.
Si conoce la última migración aplicada a una base de datos, puede generar un script de esa migración a la migración más reciente.
dotnet ef migrations script CurrentMigration
De lo contrario, se recomienda usar dotnet ef database update para aplicar migraciones. Puede especificar el archivo de base de datos al ejecutar el comando.
dotnet ef database update --connection "Data Source=My.db"
Protección de migraciones simultáneas
EF9 introdujo un mecanismo de bloqueo de migración para protegerse frente a ejecuciones simultáneas de migración. A diferencia de SQL Server, que usa un bloqueo de aplicación de nivel de sesión (sp_getapplock) que se libera automáticamente cuando se cierra la conexión, SQLite no tiene bloqueos de aplicación integrados. EF Core crea en cambio una __EFMigrationsLock tabla e inserta una fila para adquirir el bloqueo.
Gestión de bloqueos abandonados
Si la aplicación finaliza inesperadamente (por ejemplo, si el proceso se termina durante la migración), es posible que no se limpie la fila de bloqueo en la tabla __EFMigrationsLock. Esto impide que se complete cualquier migración posterior, ya que cada intento esperará indefinidamente para que se libere el bloqueo.
Para resolver un bloqueo abandonado, quite la __EFMigrationsLock tabla de la base de datos:
DROP TABLE "__EFMigrationsLock";
O bien, como alternativa, elimine todas las filas de la tabla:
DELETE FROM "__EFMigrationsLock";
Después de borrar el bloqueo, las operaciones de migración posteriores continúan normalmente. La tabla se vuelve a crear automáticamente según sea necesario.