You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级EF Core 7后触发SqliteException错误,求解决方案

EF Core 7升级后SQLite Error 1的排查与解决

错误原因分析

  1. EnsureCreated()与迁移系统冲突:EF Core中EnsureCreated()会直接创建数据库 schema 但跳过迁移历史表,后续调用GetPendingMigrations()时,迁移系统无法找到预期的历史表,导致SQLite抛出模糊的错误码1。
  2. NetTopologySuite集成行为变更:EF Core 7对SQLite空间类型的初始化逻辑做了调整,若在DbContext构造函数中过早触发数据库操作,NetTopologySuite的原生库可能未完成加载,引发底层SQLite错误。
  3. 路径获取的潜在问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:45:32