ASP.NET Core MVC使用EF Core连接现有Azure SQL数据库及迁移方案
ASP.NET Core 集成EF Core + Azure App Service 自动迁移分步操作
第一步:安装EF Core依赖包
- 右键项目选择「管理NuGet程序包」,或直接在包管理器控制台执行以下命令安装对应包,包大版本需和项目当前使用的ASP.NET Core运行时版本保持一致,避免兼容性问题:
Install-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFrameworkCore.Tools Install-Package Microsoft.EntityFrameworkCore.Design
第二步:定义DbContext与业务实体
- 在项目中新建存放数据模型的目录,按业务需求定义实体类,示例:
using System.ComponentModel.DataAnnotations; namespace WebAppAzure.Models { public class BusinessData { [Key] public int Id { get; set; } public string Content { get; set; } public DateTime CreatedAt { get; set; } } }
- 新建继承自
DbContext的数据库上下文类,通过构造函数注入配置,添加对应业务表的DbSet属性:
using Microsoft.EntityFrameworkCore; namespace WebAppAzure.Models { public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } // 映射业务数据表 public DbSet<BusinessData> BusinessDatas { get; set; } // 已有表的映射、字段配置等可在OnModelCreating中通过Fluent API编写 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } }
EF Core不会操作未在上下文中映射的表,你之前创建的_Cache分布式缓存表不会受后续迁移操作影响
第三步:在Program.cs中注册EF Core服务
找到现有Program.cs中注册分布式缓存的代码段,在其之前添加DbContext服务注册,直接复用已有的db连接字符串配置,不需要新增配置项:
// 注册EF Core数据库上下文 builder.Services.AddDbContext<AppDbContext>(options => { options.UseSqlServer(builder.Configuration.GetConnectionString("db")); }); // 以下是你原有的分布式缓存注册代码,不需要修改 builder.Services.AddDistributedSqlServerCache(options => { options.ConnectionString = builder.Configuration.GetConnectionString("db"); options.SchemaName = "dbo"; options.TableName = "_Cache"; });
原有Azure Key Vault取配置的逻辑完全兼容,只要Key Vault中存储的db连接字符串有效,EF Core可正常读取,不需要额外调整配置链路
第四步:配置应用启动时自动执行迁移
不需要额外引入Azure Functions或其他服务,直接在应用启动阶段执行未应用的迁移即可,实现发布后自动同步表结构。找到var app = builder.Build();代码行,在其后、HTTP管道配置代码之前添加迁移执行逻辑:
var app = builder.Build(); // 启动时自动应用所有待执行的迁移 using (var serviceScope = app.Services.CreateScope()) { var db = serviceScope.ServiceProvider.GetRequiredService<AppDbContext>(); // 注意:需要保证连接数据库的账号拥有DDL权限(建表、改表、操作迁移历史表权限),Azure SQL可对应用户添加db_ddladmin角色 db.Database.Migrate(); } // 以下是你原有的HTTP管道配置代码,不需要修改 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } // 注意:你贴出的Program.cs代码未包含后续的UseStaticFiles、UseRouting、MapControllerRoute等中间件配置,请保留原有代码不要删除
禁止使用
Database.EnsureCreated()方法实现初始化,该方法不会走迁移版本逻辑,后续迭代修改表结构时不会同步更新,完全不适用生产环境版本迭代场景。
第五步:生成迁移文件、发布验证
- 打开包管理器控制台,执行命令生成首个迁移文件:
- 如果是全新库、没有提前创建业务表,直接执行:
Add-Migration InitialCreate- 如果是对接已经存在业务表的存量数据库,加参数生成空迁移,避免EF Core重复创建已存在的表:
Add-Migration InitialCreate -IgnoreChanges - 本地开发环境可执行
Update-Database命令验证迁移逻辑是否正常,确认无报错后提交代码发布到Azure App Service即可。 - 后续版本迭代需要调整表结构(新增字段、新增表、加索引等)时,只要修改对应实体类或Fluent API配置,重新执行
Add-Migration 自定义迁移名称生成新的迁移文件,发布后应用启动时会自动将未执行的迁移同步到Azure SQL数据库,不需要手动连接数据库执行脚本。
常见问题说明
- 迁移操作会自动在数据库中生成
__EFMigrationsHistory表记录迁移版本,不要手动修改或删除这张表。 - 如果应用使用托管标识连接Azure SQL,需要提前给对应标识授予数据库的DDL操作权限,否则启动时迁移会抛出权限不足错误。
- 迁移执行逻辑会自动判断环境,开发、生产环境共用同一套逻辑,不需要做环境分支判断。
内容的提问来源于stack exchange,提问作者Inbar Manor
相关产品推荐
相关产品推荐

