EF Core+SQLite迁移更新后出现__EFMigrationsHistory表不存在错误
解决SQLite Error 1: no such table: __EFMigrationsHistory
问题根源
这个错误说明EF Core用来追踪迁移记录的__EFMigrationsHistory表不存在,大概率是迁移未正确生成/应用,或是程序连接的数据库文件和迁移目标不一致。结合你的代码,可能的诱因包括:
- 迁移文件未生成或未执行到数据库
- 数据库文件路径配置存在歧义,导致程序连接了空数据库
- 配置加载逻辑覆盖了默认的连接字符串配置
分步解决方法
1. 重新生成并应用迁移
打开终端进入项目根目录,执行以下命令:
# 生成初始迁移文件(如果还没生成过) dotnet ef migrations add InitialCreate --context AlbumContext # 将迁移应用到数据库 dotnet ef database update --context AlbumContext
如果你的AlbumContext不在启动项目中,需要加上--project参数指定DbContext所在的类库路径。
2. 固定数据库文件路径
你的连接字符串用的是相对路径Data Source=vinyltap.db,这种路径会根据程序运行时的工作目录变化,容易出现“迁移生成的db和程序连接的db不是同一个”的问题。可以修改为绝对路径,或者在Program.cs中明确指定路径:
// 在Program.cs的DbContext配置部分修改 var dbPath = Path.Combine(Directory.GetCurrentDirectory(), "vinyltap.db"); builder.Services.AddDbContext<AlbumContext>(options => { options.UseSqlite($"Data Source={dbPath}"); });
3. 修复配置加载逻辑
你在Program.cs中调用了builder.Configuration.Sources.Clear();,这会清除默认的配置源(包括appsettings.json),可能导致连接字符串读取失败。建议调整为追加自定义配置源,保留默认配置:
var builder = WebApplication.CreateBuilder(args); // 移除Sources.Clear(),改为追加自定义配置源 builder.Configuration .AddUserSecrets(Assembly.GetEntryAssembly()!) .AddEnvironmentVariables() .AddDotEnvFile();
4. 优化DbContext构造函数
你的AlbumContext构造函数用了非泛型的DbContextOptions,建议改为泛型版本,避免配置注入时出现歧义:
public AlbumContext(DbContextOptions<AlbumContext> options) : base(options) { }
5. 可选:添加数据库初始化逻辑
如果是开发环境快速验证,可以在Program.cs中添加初始化代码(注意:用EnsureCreated会跳过迁移系统,后续无法切换到迁移模式):
var app = builder.Build(); // 添加数据库初始化逻辑 using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; var context = services.GetRequiredService<AlbumContext>(); // 确保数据库及表创建完成 context.Database.EnsureCreated(); // 执行种子数据初始化 DbInitializer.Initialize(context); } // 后续中间件配置... app.UseHttpsRedirection(); // ...
验证流程
- 删除项目根目录下已有的
vinyltap.db文件 - 重新执行迁移生成和应用命令
- 启动程序,检查
vinyltap.db是否重新生成,且包含__EFMigrationsHistory表及其他业务表
内容的提问来源于stack exchange,提问作者JHookerDev
相关产品推荐
相关产品推荐

