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

使用EF Core 6执行迁移时,如何修改Azure SQL自动创建数据库的默认定价计划或禁用该自动建库行为?

我之前也踩过类似的坑,刚好能给你解答这两个问题:

一、在EF Core中禁用自动创建数据库的行为

EF Core默认在执行Migrate()或者EnsureCreated()时,如果数据库不存在会自动创建,要阻止这个行为,核心是在执行迁移前先检查数据库是否存在,具体有两种常用方式:

  • 方式1:在启动逻辑中添加数据库存在性检查
    不要直接调用Migrate(),先通过CanConnectAsync()判断数据库是否能连接(也就是是否存在),如果不存在就抛出异常或终止迁移流程,示例代码如下:
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddDbContext<YourDbContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("AzureSqlConnection")));
    
    var app = builder.Build();
    
    using (var scope = app.Services.CreateScope())
    {
        var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();
        // 检查数据库是否存在
        if (!await dbContext.Database.CanConnectAsync())
        {
            // 这里可以根据需求抛出异常、记录告警日志,或者提示手动创建数据库
            throw new InvalidOperationException("目标数据库不存在,请先在Azure SQL Server中手动创建后再执行迁移。");
        }
        // 仅当数据库存在时执行迁移
        await dbContext.Database.MigrateAsync();
    }
    
    app.Run();
    
  • 方式2:避免使用EnsureCreated()方法
    注意EnsureCreated()是直接创建数据库和Schema(不会执行迁移文件),很多自动建库的情况都是不小心调用了这个方法。如果你需要用迁移来管理Schema,一定要用Migrate()而不是EnsureCreated(),并且加上上面的存在性检查。
二、Azure中修改自动创建数据库的默认定价计划?

很遗憾,Azure SQL Server本身没有全局设置能直接指定自动创建数据库的默认服务层级/定价计划,但有几个替代方案可以解决这个问题:

  • 方案1:用Azure Policy强制规范数据库定价
    你可以创建一个Azure Policy,当新的SQL数据库被创建(包括EF Core自动创建的)时,自动将其修正为你指定的低成本定价层级(比如Basic、S0等)。策略的核心逻辑是检查数据库的sku.name是否符合你的要求,不符合则触发自动修正。
  • 方案2:提前手动/脚本创建数据库
    先通过Azure Portal、Azure CLI或者ARM模板创建好数据库,明确指定你需要的定价计划,然后让EF Core只针对这个已存在的数据库执行迁移。从根源上避免自动创建的情况。
  • 方案3:使用Azure SQL弹性池
    如果你的服务器上有多个数据库,可以先创建一个弹性池并设置好预算,然后通过Policy强制所有新创建的数据库加入这个弹性池。这样即使不小心自动创建了数据库,也会纳入弹性池的成本管控中,避免单个数据库使用高成本的独立定价。

另外提醒一下:如果已经触发了自动创建的高成本数据库,记得及时在Azure Portal中修改它的定价层级或者直接删除,避免产生不必要的费用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:37:41