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

Entity Framework在IIS正常但Azure App Service报错:无效对象名dbo.People

EF部署到Azure App Service时出现“Invalid object name 'dbo.People'”问题排查

问题详情

执行以下代码时:

var firstPerson _deskAssignmentContextBackup.People.First();

收到错误:

Invalid object name 'dbo.People'

现象:本地IIS部署完全正常,仅Azure App Service部署后出现该错误。Context通过数据库优先方式创建,已确认各环境的数据库连接和结构一致,怀疑是环境底层配置差异导致。

DbContext代码片段

public class DeskAssignmentContextBackup : DbContext
{
    public DeskAssignmentContextBackup()
    {
    }

    public DeskAssignmentContextBackup(DbContextOptions<DeskAssignmentContextBackup> options)
      : base(options)
    {
    }

    public virtual DbSet<Person> People { get; set; } = null!;

    public virtual DbSet<Supervisor> Supervisors { get; set; } = null!;


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Person>(entity =>
      {
        entity.HasKey(e => e.Id).HasName("PK_dbo.People");
        entity.HasIndex(e => e.Id, "IX_Id");
        entity.HasIndex(e => e.SupervisorId, "IX_Supervisor_Id");

        entity.Property(e => e.EndDate).HasColumnType("datetime");
        entity.Property(e => e.SupervisorId).HasColumnName("Supervisor_Id");

        entity.HasOne(d => d.Supervisor).WithMany(p => p.People)
          .HasForeignKey(d => d.SupervisorId)
          .HasConstraintName("FK_dbo.People_dbo.Supervisors_Supervisor_Id");
      });

      modelBuilder.Entity<Supervisor>(entity =>
      {
        entity.HasKey(e => e.Id).HasName("PK_dbo.Supervisors");
        entity.HasIndex(e => e.Id, "IX_Id");
      });
    }
  }

排查与解决思路

  • 检查Azure数据库用户的默认架构
    登录Azure SQL数据库,执行以下语句查看连接串所用登录用户的默认架构:

    SELECT name, default_schema_name FROM sys.database_principals WHERE name = '你的数据库登录名'
    

    如果默认架构不是dbo,EF会尝试访问[用户名].People而非dbo.People,此时可修改用户默认架构:

    ALTER USER [你的数据库登录名] WITH DEFAULT_SCHEMA = dbo;
    
  • 显式指定实体表的架构
    在OnModelCreating中为每个实体明确指定dbo架构,消除默认配置的不确定性:

    modelBuilder.Entity<Person>(entity =>
    {
        entity.ToTable("People", "dbo"); // 新增指定架构
        entity.HasKey(e => e.Id).HasName("PK_dbo.People");
        // 其他原有配置...
    });
    
    modelBuilder.Entity<Supervisor>(entity =>
    {
        entity.ToTable("Supervisors", "dbo"); // 新增指定架构
        entity.HasKey(e => e.Id).HasName("PK_dbo.Supervisors");
        // 其他原有配置...
    });
    
  • 验证Azure App Service的连接串配置
    登录Azure门户,进入目标App Service的「配置」->「应用程序设置」,确认连接串:

    • 指向的数据库与本地一致
    • 无拼写错误(服务器名、数据库名、用户名/密码)
    • 连接串名称与代码中读取的名称完全匹配
  • 确认Azure SQL数据库表的存在性
    直接在Azure SQL数据库中检查dbo.People和dbo.Supervisors表是否存在,同时确认表名大小写与代码一致(若数据库collation区分大小写,大小写不匹配会引发错误)。

  • 排查EF的环境特定配置
    检查项目中针对Azure环境的配置文件(如appsettings.Azure.json)或Startup/Program.cs中的环境分支代码,确认是否存在覆盖DbContext默认行为的配置(比如自定义表名映射规则)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:22:46