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

如何使用Entity Framework Core通过SQL脚本初始化全新数据库

嘿,我来帮你搞定EF Core里的这个需求!你之前在传统EF里用DropCreateDatabaseAlways的思路,在EF Core里可以通过几种直观的方式实现,核心就是确保每次启动应用时都能重置数据库并执行你的SQL脚本。

在EF Core中实现每次启动重置数据库并执行SQL脚本

方法一:应用启动时直接处理(.NET 6+ 推荐)

在你的Program.cs(老版本用Startup.cs)里,直接嵌入数据库初始化逻辑,这是最直接的实现方式:

var builder = WebApplication.CreateBuilder(args);

// 注册你的DbContext
builder.Services.AddDbContext<AnnotationContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("YourConnectionString")));

var app = builder.Build();

// 初始化数据库逻辑
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<AnnotationContext>();
    
    // 删除现有数据库(如果存在)
    context.Database.EnsureDeleted();
    // 创建空数据库
    context.Database.EnsureCreated();
    
    // 读取并执行你的SQL脚本
    var sqlScript = File.ReadAllText("dropAndCreateEntireDatabase.sql");
    context.Database.ExecuteSqlRaw(sqlScript);
}

// 其他中间件配置...
app.Run();

这里的关键细节:

  • EnsureDeleted():对应传统EF里的删除数据库操作,会删掉当前连接指向的数据库
  • EnsureCreated():创建一个全新的空数据库(注意:这个方法不会应用迁移,如果你用了迁移体系,可替换为Migrate(),但你用自定义SQL脚本的话,EnsureCreated()更合适)
  • ExecuteSqlRaw():EF Core替代传统EFExecuteSqlCommand的方法,专门用来执行原始SQL脚本

方法二:封装成自定义初始化器(贴近传统EF写法)

如果你更习惯像传统EF那样封装成独立的初始化类,可以创建一个静态工具类:

internal static class AnnotationContextDatabaseInitializer
{
    public static void Initialize(AnnotationContext context)
    {
        // 先删再建数据库
        context.Database.EnsureDeleted();
        context.Database.EnsureCreated();
        
        // 执行初始化SQL脚本
        var sqlScript = File.ReadAllText("dropAndCreateEntireDatabase.sql");
        context.Database.ExecuteSqlRaw(sqlScript);
    }
}

然后在启动时调用这个方法即可:

// 在Program.cs的作用域代码块里
var context = services.GetRequiredService<AnnotationContext>();
AnnotationContextDatabaseInitializer.Initialize(context);

重要注意事项

  • 脚本路径问题:确保你的SQL脚本路径正确,建议右键脚本文件 → 属性 → 设置「复制到输出目录」为「如果较新则复制」,这样发布后脚本会和程序集在一起
  • 异步场景适配:如果你的项目用异步上下文,记得用对应异步方法:EnsureDeletedAsync()、EnsureCreatedAsync()、ExecuteSqlRawAsync()
  • 参数化脚本:如果你的脚本需要传入参数,推荐用ExecuteSqlInterpolated()或者带参数的ExecuteSqlRaw()重载,避免SQL注入风险

这样就能完美实现你想要的效果:每次运行应用,都会得到一个全新的数据库,并且自动执行你的SQL脚本完成结构初始化。

内容的提问来源于stack exchange,提问作者Fábio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:30:48