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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:18:38