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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:09:11