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

