如何用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
相关产品推荐
相关产品推荐

