Limitaciones del proveedor de base de datos de SQLite EF CoreSQLite EF Core Database Provider Limitations

El proveedor de SQLite tiene una serie de limitaciones de las migraciones.The SQLite provider has a number of migrations limitations. La mayoría de estas limitaciones es el resultado de las limitaciones en el motor de base de datos de SQLite subyacente y no es específica para EF.Most of these limitations are a result of limitations in the underlying SQLite database engine and are not specific to EF.

Limitaciones del modeladoModeling limitations

La biblioteca común de relacional (compartida por los proveedores de base de datos relacional de Entity Framework) define las API para la modelización de conceptos que son comunes a la mayoría de los motores de base de datos relacional.The common relational library (shared by Entity Framework relational database providers) defines APIs for modelling concepts that are common to most relational database engines. Un par de estos conceptos no se admiten por el proveedor de SQLite.A couple of these concepts are not supported by the SQLite provider.

  • EsquemasSchemas
  • SecuenciasSequences
  • Columnas calculadasComputed columns

Limitaciones de la consultaQuery limitations

SQLite no admite de forma nativa los siguientes tipos de datos.SQLite doesn't natively support the following data types. EF Core puede leer y escribir valores de estos tipos y consultas de igualdad (where e.Property == value) también es compatible con.EF Core can read and write values of these types, and querying for equality (where e.Property == value) is also support. Otras operaciones, sin embargo, al igual que la comparación y ordenación requerirá la evaluación en el cliente.Other operations, however, like comparison and ordering will require evaluation on the client.

  • DateTimeOffsetDateTimeOffset
  • DecimalDecimal
  • TimeSpanTimeSpan
  • UInt64UInt64

En lugar de DateTimeOffset, recomendamos usar valores de fecha y hora.Instead of DateTimeOffset, we recommend using DateTime values. Al controlar varias zonas horarias, se recomienda convertir los valores a la hora UTC antes de guardar y, a continuación, volver a convertir a la zona horaria adecuada.When handling multiple time zones, we recommend converting the values to UTC before saving and then converting back to the appropriate time zone.

El Decimal tipo proporciona un alto nivel de precisión.The Decimal type provides a high level of precision. Si no necesita ese nivel de precisión, sin embargo, se recomienda usar dobles en su lugar.If you don't need that level of precision, however, we recommend using double instead. Puede usar un convertidor para seguir usando el separador decimal en las clases.You can use a value converter to continue using decimal in your classes.

modelBuilder.Entity<MyEntity>()
    .Property(e => e.DecimalProperty)
    .HasConversion<double>();

Limitaciones de las migracionesMigrations limitations

El motor de base de datos de SQLite no admite un número de operaciones de esquema que son compatibles con la mayoría de otras bases de datos relacionales.The SQLite database engine does not support a number of schema operations that are supported by the majority of other relational databases. Si intenta aplicar una de las operaciones no admitidas en una base de datos de SQLite un NotSupportedException se iniciará.If you attempt to apply one of the unsupported operations to a SQLite database then a NotSupportedException will be thrown.

OperaciónOperation ¿Admite?Supported? Requiere la versiónRequires version
AddColumnAddColumn 1.01.0
AddForeignKeyAddForeignKey
AddPrimaryKeyAddPrimaryKey
AddUniqueConstraintAddUniqueConstraint
AlterColumnAlterColumn
CreateIndexCreateIndex 1.01.0
CreateTableCreateTable 1.01.0
DropColumnDropColumn
DropForeignKeyDropForeignKey
DropIndexDropIndex 1.01.0
DropPrimaryKeyDropPrimaryKey
DropTableDropTable 1.01.0
DropUniqueConstraintDropUniqueConstraint
RenameColumnRenameColumn 2.2.22.2.2
RenameIndexRenameIndex 2.12.1
RenameTableRenameTable 1.01.0
EnsureSchemaEnsureSchema ✔ (no operativo)✔ (no-op) 2.02.0
DropSchemaDropSchema ✔ (no operativo)✔ (no-op) 2.02.0
InsertarInsert 2.02.0
ActualizarUpdate 2.02.0
EliminarDelete 2.02.0

Solución alternativa de las limitaciones de las migracionesMigrations limitations workaround

Puede solucionar algunas de estas limitaciones escribiendo manualmente el código en las migraciones para realizar una tabla de volver a generar.You can workaround some of these limitations by manually writing code in your migrations to perform a table rebuild. Una recompilación de la tabla implica cambiar el nombre de la tabla existente, crear otra tabla, copiar los datos en la tabla nueva y eliminar la anterior.A table rebuild involves renaming the existing table, creating a new table, copying data to the new table, and dropping the old table. Deberá usar el Sql(string) método para realizar algunos de estos pasos.You will need to use the Sql(string) method to perform some of these steps.

Consulte realizar otros tipos de tabla de cambios de esquema en la documentación de SQLite para obtener más detalles.See Making Other Kinds Of Table Schema Changes in the SQLite documentation for more details.

En el futuro, EF puede admitir algunas de estas operaciones mediante el enfoque de regeneración de la tabla en segundo plano.In the future, EF may support some of these operations by using the table rebuild approach under the covers. También puede realizar un seguimiento de esta característica en nuestro proyecto de GitHub.You can track this feature on our GitHub project.