对象名称 dbo 表名无效 - 实体框架适用于 IIS,但不适用于 Azure 应用服务

问题描述 投票:0回答:2

在尝试使用以下代码从表中检索数据时遇到实体框架问题:

var firstPerson _deskAssignmentContextBackup.People.First();

我收到的错误消息是:“对象名称‘dbo.People’无效”。

奇怪的是,只有当应用程序作为应用服务部署到 Azure 时,才会出现此错误。当我将完全相同的代码部署到本地 IIS 时,一切都工作得很好。这让我相信问题不在于数据库或 DbContext 配置。

用于此操作的上下文是使用数据库优先方法创建的,确保连接和数据库结构在环境之间完美匹配。

我怀疑可能存在潜在的配置差异或环境特定因素导致此行为。

下面是 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");
      });
    }
  }

任何关于如何进一步排查和解决此问题的见解或指导将不胜感激。预先感谢您的协助!

c# .net database entity-framework azure-web-app-service
2个回答
1
投票

这个错误显然是由于无法找到

dbo.People
表造成的。

如果我理解正确,那么您正在两个不同的环境中运行数据库查询。第一个是本地的,第二个是 Azure 的。

因此,如果表

dbo.People
确实存在(请仔细检查),我建议您检查用户是否具有适当的权限来运行查询

另外,请检查架构和名称,也许有

dbo.People
s,或 public
.People


0
投票

我找到了问题和解决方案。

问题是 Azure 会自动生成一个 appsettings.production.json 文件,我没有注意到它,因为它不存在于我的项目中;我只有 appsettings.json。

当我验证连接字符串时,我正在检查appsettings.json。然而,事实证明,在 appsettings.production.json 文件中,Azure 并未从 appsettings.json 复制连接字符串,而是从发布配置文件复制连接字符串。这就是问题所在。

当我的上下文被定位时,在某个时刻发生了错误,并且所有数据库都被分配了相同的连接字符串。这就是为什么一个数据库工作而另一个数据库不工作的原因。

我指的是这个特定时刻:

我想对大家提出的建议表示感谢;现在我对它的工作原理有了更好的理解。

© www.soinside.com 2019 - 2024. All rights reserved.