升级EF Core 7后触发SqliteException错误,求解决方案
EF Core 7升级后SQLite Error 1的排查与解决
错误原因分析
EnsureCreated()与迁移系统冲突:EF Core中EnsureCreated()会直接创建数据库 schema 但跳过迁移历史表,后续调用GetPendingMigrations()时,迁移系统无法找到预期的历史表,导致SQLite抛出模糊的错误码1。- NetTopologySuite集成行为变更:EF Core 7对SQLite空间类型的初始化逻辑做了调整,若在DbContext构造函数中过早触发数据库操作,NetTopologySuite的原生库可能未完成加载,引发底层SQLite错误。
- 路径获取的潜在问题:
Assembly.GetExecutingAssembly().Location在.NET 7的WinForms/Blazor混合应用中可能返回非预期路径,导致数据库文件创建位置异常,间接引发连接错误。
解决方法
1. 移除构造函数中的EnsureCreated()调用
EnsureCreated()和迁移系统不兼容,二选一即可。若使用迁移,完全依赖Migrate()初始化数据库:
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { if (Database.GetPendingMigrations().Any()) { Database.Migrate(); } }
若无需迁移,保留EnsureCreated()但移除所有迁移相关代码,确保逻辑单一。
2. 修复NetTopologySuite初始化顺序
在应用启动时提前初始化NetTopologySuite,避免DbContext构造阶段的加载问题:
// 应用入口(如Program.cs或Form_Load方法中) SQLiteNetTopologySuite.Initialize();
同时确保NuGet包版本一致:Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite的版本必须与EF Core 7完全匹配。
3. 修正数据库路径拼接逻辑
使用更稳定的路径获取方式,并提前创建目录:
if (!optionsBuilder.IsConfigured) { var appDataPath = Path.Combine(AppContext.BaseDirectory, "AppData"); // 确保目录存在,避免数据库文件无法写入 Directory.CreateDirectory(appDataPath); var dbPath = Path.Combine(appDataPath, "AppDB.db"); optionsBuilder.UseSqlite($"Data Source={dbPath}", options => { options.UseNetTopologySuite(); }); }
AppContext.BaseDirectory在.NET 7中比Assembly.GetExecutingAssembly().Location更可靠,适合获取应用运行目录。
4. 彻底重置迁移
清理旧迁移残留并重新生成:
- 删除项目中的Migrations文件夹
- 删除本地SQLite数据库文件
- 在Package Manager Console执行命令:
Add-Migration InitialCreate Update-Database
确保使用EF Core 7的工具链生成迁移文件,避免旧版本兼容性问题。
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

