WPF应用执行update-database时遇SQLite错误:无__EFMigrationsHistory表
问题:SQLite EF Core 初始迁移执行
update-database报错:no such table: __EFMigrationsHistory 执行add-migration Initial可正常生成迁移文件,但运行update-database时触发错误:
SQLite Error 1: 'no such table: __EFMigrationsHistory'
相关代码如下:
namespace ToDoListApp.Data; public class ApplicationDbContext : DbContext { private readonly string _connectionString = ConfigurationManager.AppSettings["Database"]; public DbSet<Task> Tasks { get; set; } public ApplicationDbContext(DbContextOptions options) : base(options) { } public ApplicationDbContext() { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration(new TasksConfiguration()); } }
namespace ToDoListApp.Data; public class ApplicationDesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { private readonly string _connectionString = ConfigurationManager.AppSettings["Database"]; public ApplicationDbContext CreateDbContext(string[] args) { var options = new DbContextOptionsBuilder().UseSqlite(_connectionString).Options; return new ApplicationDbContext(options); } }
public class TasksConfiguration : IEntityTypeConfiguration<Task> { public void Configure(EntityTypeBuilder<Task> builder) { builder.HasKey(t => t.Id); builder.Property(t => t.Title) .HasMaxLength(35) .IsRequired(); builder.Property(t => t.Description) .HasMaxLength(200) .IsRequired(); } }
namespace ToDoListApp; /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { private IServiceProvider _serviceProvider; private string _connectionString = @ConfigurationManager.AppSettings["Database"]; public App() { ConfigureServices(); } private void ConfigureServices() { var services = new ServiceCollection(); services.AddSingleton<TaskWindow>(); services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(_connectionString)); services.AddScoped<IRepository<Task>, TaskRepositoryDatabase>(); services.AddScoped<IService<Task>, TaskService>(); services.AddScoped<TaskViewModel>(); _serviceProvider = services.BuildServiceProvider(); } protected override void OnStartup(StartupEventArgs e) { var taskWindow = _serviceProvider.GetRequiredService<TaskWindow>(); taskWindow.DataContext = _serviceProvider.GetRequiredService<TaskViewModel>(); taskWindow.Show(); base.OnStartup(e); } }
解决方案
1. 修复ApplicationDbContext无参构造函数的连接配置
你的ApplicationDbContext存在无参构造函数,但未配置SQLite连接字符串。EF Core执行update-database时可能优先使用该构造函数,导致连接到默认空SQLite数据库,无法找到__EFMigrationsHistory表。修改无参构造函数:
public ApplicationDbContext() : base(GetOptions()) { } private static DbContextOptions<ApplicationDbContext> GetOptions() { var connectionString = ConfigurationManager.AppSettings["Database"]; return new DbContextOptionsBuilder<ApplicationDbContext>() .UseSqlite(connectionString) .Options; }
2. 修正DesignTimeDbContextFactory的泛型配置
使用泛型DbContextOptionsBuilder<ApplicationDbContext>替代非泛型版本,避免上下文配置不一致:
public ApplicationDbContext CreateDbContext(string[] args) { var connectionString = ConfigurationManager.AppSettings["Database"]; var options = new DbContextOptionsBuilder<ApplicationDbContext>() .UseSqlite(connectionString) .Options; return new ApplicationDbContext(options); }
3. 重置迁移状态(可选)
若之前的迁移已处于异常状态,可执行以下步骤重置:
- 删除项目中
Migrations文件夹的所有文件 - 删除本地SQLite数据库文件(如
.db格式文件) - 重新执行命令:
add-migration Initial update-database
4. 验证连接字符串有效性
确认ConfigurationManager.AppSettings["Database"]读取到的是正确格式的SQLite连接字符串,示例格式:
Data Source=ToDoList.db;
可在ApplicationDesignTimeDbContextFactory中添加日志输出验证:
public ApplicationDbContext CreateDbContext(string[] args) { Console.WriteLine($"当前连接字符串:{_connectionString}"); // 原有代码... }
内容的提问来源于stack exchange,提问作者tudoooor
相关产品推荐
相关产品推荐

