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

如何用C#代码自动删除SQLite所有表并通过EF Core重建

实现方法

完全可以通过C#代码实现全流程自动化,不需要手动删表、删迁移、敲终端命令,以下是两种适配开发场景的方案,按需选择即可。


方案1:开发调试极速重置(推荐频繁改模型的场景使用)

这个方案不需要维护迁移文件,直接利用EF Core内置方法完成删库重建,是开发阶段效率最高的实现方式:

  • 直接删除整个SQLite的.db单文件,比逐表删除更彻底,不会有残留表、残留索引或者数据
  • 直接根据你当前代码里最新的DbSet<T>定义、实体Fluent配置生成完全匹配的库结构
  • 不需要执行任何EF Core的迁移命令,启动应用自动完成所有操作

实现代码

在Program.cs中,var app = builder.Build(); 行之后添加如下代码:

// 仅在开发环境生效,绝对不要在生产环境开启
if (builder.Environment.IsDevelopment())
{
    using var scope = app.Services.CreateScope();
    var dbContext = scope.ServiceProvider.GetRequiredService<你的自定义DbContext类名>();
    
    // 删除现有数据库文件
    await dbContext.Database.EnsureDeletedAsync();
    // 根据最新模型重建整个数据库
    await dbContext.Database.EnsureCreatedAsync();
}

注意:该方案不会生成迁移文件,仅适合本地快速迭代调试使用,不会保留任何历史数据和结构变更记录。


方案2:保留迁移流程的自动化实现

如果你需要保留EF Core迁移文件做版本管理,不想跳过迁移流程,也可以通过代码自动完成「删库-清理旧迁移-生成新初始化迁移-更新数据库」的全流程:

实现代码

首先添加一个独立的数据库重置辅助类:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Migrations.Design;
using Microsoft.Extensions.DependencyInjection;

public static class DbAutoResetHelper
{
    public static async Task ResetWithMigrationsAsync<TContext>(
        string connectionString, 
        string migrationsDirectory = "Migrations") 
        where TContext : DbContext
    {
        // 初始化DbContext配置
        var optionsBuilder = new DbContextOptionsBuilder<TContext>();
        optionsBuilder.UseSqlite(connectionString);
        
        var baseServices = new ServiceCollection()
            .AddEntityFrameworkSqlite()
            .AddDbContext<TContext>(o => o.UseSqlite(connectionString))
            .BuildServiceProvider();

        using var dbContext = baseServices.GetRequiredService<TContext>();
        
        // 1. 删除现有数据库
        await dbContext.Database.EnsureDeletedAsync();
        
        // 2. 清理旧的迁移文件目录
        if (Directory.Exists(migrationsDirectory))
        {
            Directory.Delete(migrationsDirectory, recursive: true);
        }
        
        // 3. 自动生成新的初始化迁移
        var scaffolder = baseServices.GetRequiredService<IMigrationsScaffolder>();
        scaffolder.ScaffoldMigration(
            migrationName: "FirstMigration",
            rootNamespace: typeof(TContext).Namespace!,
            migrationsSubNamespace: "Migrations",
            migrationsDir: migrationsDirectory,
            language: "CSharp");
        
        // 4. 应用迁移完成建库
        await dbContext.Database.MigrateAsync();
    }
}

同样在Program.cs中添加开发环境调用逻辑即可:

if (builder.Environment.IsDevelopment())
{
    using var scope = app.Services.CreateScope();
    var config = scope.ServiceProvider.GetRequiredService<IConfiguration>();
    // 从配置文件取连接字符串,和你正常的DbContext配置保持一致即可
    var connStr = config.GetConnectionString("你的SQLite连接字符串配置名");
    await DbAutoResetHelper.ResetWithMigrationsAsync<你的自定义DbContext类名>(connStr);
}

重要提醒:所有重置逻辑必须加环境判断,一旦在生产环境触发会直接删除所有业务数据,造成不可逆损失。

配置完成后,你每次修改完实体类或者DbSet<T>配置,只需要启动应用就会自动完成所有数据库重置操作,不需要再做任何手动操作。

内容的提问来源于stack exchange,提问作者Graf123456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:06:18