Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O provedor SQLite tem várias limitações de migrações. A maioria dessas limitações é resultado de limitações no mecanismo de banco de dados SQLite subjacente e não são específicas do EF.
Limitações de modelagem
A biblioteca relacional comum (compartilhada por provedores de banco de dados relacionais do EF Core) define APIs para conceitos de modelagem que são comuns à maioria dos mecanismos de banco de dados relacionais. Alguns desses conceitos não são compatíveis com o provedor SQLite.
- Esquemas
- Sequências
- Tokens de simultaneidade gerados pelo banco de dados (consulte a documentação)
Limitações da consulta
O SQLite não dá suporte nativo aos seguintes tipos de dados. O EF Core pode ler e gravar valores desses tipos, e também há suporte para a consulta por igualdade (where e.Property == value). No entanto, outras operações, como comparação e ordenação, exigirão avaliação no cliente.
DateTimeOffsetdecimalTimeSpanulong
Em vez de DateTimeOffset, recomendamos o uso de valores DateTime. Ao manipular vários fusos horários, recomendamos converter os valores em UTC antes de salvar e converter novamente no fuso horário apropriado.
O tipo decimal fornece um alto nível de precisão. No entanto, se você não precisar desse nível de precisão, recomendamos usar double. Você pode usar um conversor de valor para continuar usando decimal em suas classes.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Limitações de migrações
O mecanismo de banco de dados SQLite não dá suporte a várias operações de esquema compatíveis com a maioria dos outros bancos de dados relacionais. Se você tentar aplicar uma das operações sem suporte a um banco de dados SQLite, uma NotSupportedException será lançada.
Uma reconstrução será realizada para executar determinadas operações. Recompilações só são possíveis para artefatos de banco de dados que fazem parte do modelo do EF Core. Se um artefato de banco de dados não fizer parte do modelo , por exemplo, se ele tiver sido criado manualmente dentro de uma migração, um NotSupportedException ainda será gerado.
| Operação | Suportado? |
|---|---|
| AddCheckConstraint | ✔ (recompilar) |
| AdicionarColuna | ✔ |
| AddForeignKey | ✔ (recompilar) |
| AddPrimaryKey | ✔ (recompilar) |
| AddUniqueConstraint (AdicionarRestriçãoÚnica) | ✔ (recompilar) |
| AlterColumn | ✔ (recompilar) |
| CriarÍndice | ✔ |
| CriarTabela | ✔ |
| DropCheckConstraint | ✔ (recompilar) |
| DropColumn | ✔ (recompilar) |
| DropForeignKey | ✔ (recompilar) |
| RemoverÍndice | ✔ |
| DropPrimaryKey | ✔ (recompilar) |
| DropTable | ✔ |
| RemoverRestriçãoÚnica | ✔ (recompilar) |
| RenomearColuna | ✔ |
| RenameIndex | ✔ (recompilar) |
| RenomearTabela | ✔ |
| EnsureSchema | ✔ (no-op) |
| DropSchema | ✔ (no-op) |
| Inserir | ✔ |
| Atualizar | ✔ |
| Excluir | ✔ |
Soluções alternativas para limitações de migrações
Você pode solucionar algumas dessas limitações escrevendo manualmente o código em suas migrações para executar uma recompilação. As recompilações de tabela envolvem a criação de uma nova tabela, a cópia de dados para a nova tabela, a remoção da tabela antiga, a renomeação da nova tabela. Você precisará usar o método Sql para executar algumas dessas etapas.
Consulte Como fazer outros tipos de alterações de esquema de tabela na documentação do SQLite para obter mais detalhes.
Limitações de script idempotente
Ao contrário de outros bancos de dados, o SQLite não inclui uma linguagem processual. Por isso, não há como gerar a lógica if-then exigida pelos scripts de migração idempotentes.
Se você souber a última migração aplicada a um banco de dados, poderá gerar um script dessa migração para a migração mais recente.
dotnet ef migrations script CurrentMigration
Caso contrário, recomendamos usar dotnet ef database update para aplicar migrações. Você pode especificar o arquivo de banco de dados ao executar o comando.
dotnet ef database update --connection "Data Source=My.db"
Proteção contra migrações simultâneas
O EF9 introduziu um mecanismo de bloqueio de migração para proteger contra execuções de migração simultâneas. Ao contrário de SQL Server, que usa um bloqueio de aplicativo no nível da sessão (sp_getapplock) que é liberado automaticamente quando a conexão é fechada, o SQLite não tem bloqueios de aplicativos internos. Em vez disso, o EF Core cria uma tabela __EFMigrationsLock e insere uma linha para adquirir o bloqueio.
Gerenciando bloqueios abandonados
Se o aplicativo for encerrado inesperadamente (por exemplo, o processo será encerrado durante a migração), a linha de bloqueio na tabela __EFMigrationsLock poderá não ser limpa. Isso impede que qualquer migração subsequente seja concluída, pois cada tentativa aguardará indefinidamente até que o bloqueio seja liberado.
Para resolver um bloqueio abandonado, remova a __EFMigrationsLock tabela do banco de dados:
DROP TABLE "__EFMigrationsLock";
Ou, como alternativa, excluir todas as linhas da tabela:
DELETE FROM "__EFMigrationsLock";
Depois de limpar o bloqueio, as operações de migração subsequentes prossseguem normalmente. A tabela é recriada automaticamente conforme necessário.