EF Core迁移SQLite时加载Trigram分词器失败如何解决?
解决SQLite trigram分词器加载问题(EF Core 3.1.8 + UWP)
问题根源
直接执行SQL正常但迁移失败,是因为EF Core使用的SQLite连接默认未加载trigram分词器扩展模块,而你手动执行SQL时的SQLite环境已经预先加载了该扩展。
解决步骤
1. 安装适配UWP的SQLite扩展包
通过NuGet安装包含trigram扩展的SQLite兼容包,推荐使用SQLitePCLRaw.bundle_e_sqlite3,它整合了常用扩展且适配UWP环境:
Install-Package SQLitePCLRaw.bundle_e_sqlite3 -Version 2.0.5
(注:选择与EF Core 3.1.8兼容的版本,2.0.x系列适配性更稳定)
2. 在DbContext中显式加载扩展
重写DbContext的OnConfiguring方法,在数据库连接初始化后加载trigram扩展:
using Microsoft.EntityFrameworkCore; using SQLitePCL; public class YourDbContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("你的数据库连接字符串"); // 指定SQLite提供器并加载trigram扩展 raw.SetProvider(new SQLite3Provider_e_sqlite3()); var connectionHandle = this.Database.GetDbConnection().Handle; SQLitePCL.raw.sqlite3_load_extension( connectionHandle, "sqlite3_trigram", null, out var loadError); if (!string.IsNullOrEmpty(loadError)) { throw new InvalidOperationException($"加载trigram扩展失败:{loadError}"); } } }
3. 调整迁移类(可选)
如果上下文初始化的加载逻辑在迁移执行阶段未生效,可在迁移的Up方法中先执行扩展加载命令(部分环境支持该SQL语句,优先使用代码加载方式):
public partial class FTSFirstMigration : Migration { protected override void Up(MigrationBuilder migrationBuilder) { // 先加载扩展(仅在代码加载方式失效时尝试) migrationBuilder.Sql("LOAD_EXTENSION 'sqlite3_trigram';"); // 创建FTS5虚拟表 migrationBuilder.Sql("CREATE VIRTUAL TABLE ProductFTS USING fts5(search, tokenize=\"trigram\");"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable(name: "ProductFTS"); } }
4. UWP环境额外注意事项
- 确保UWP应用包清单未限制本地库加载权限(默认允许,若有自定义权限需调整)。
- 避免使用自行编译的SQLite库,优先依赖NuGet提供的预编译适配包,否则可能出现扩展加载失败。
验证
完成配置后,运行Update-Database命令执行迁移,此时创建虚拟表的SQL应能正常执行。
内容的提问来源于stack exchange,提问作者Sayansen
相关产品推荐
相关产品推荐

