在尝试使用以下代码从表中检索数据时遇到实体框架问题:
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");
});
}
}
任何关于如何进一步排查和解决此问题的见解或指导将不胜感激。预先感谢您的协助!
这个错误显然是由于无法找到
dbo.People
表造成的。
如果我理解正确,那么您正在两个不同的环境中运行数据库查询。第一个是本地的,第二个是 Azure 的。
因此,如果表
dbo.People
确实存在(请仔细检查),我建议您检查用户是否具有适当的权限来运行查询。
另外,请检查架构和名称,也许有
dbo.People
s,或 public.People
。
我找到了问题和解决方案。
问题是 Azure 会自动生成一个 appsettings.production.json 文件,我没有注意到它,因为它不存在于我的项目中;我只有 appsettings.json。
当我验证连接字符串时,我正在检查appsettings.json。然而,事实证明,在 appsettings.production.json 文件中,Azure 并未从 appsettings.json 复制连接字符串,而是从发布配置文件复制连接字符串。这就是问题所在。
当我的上下文被定位时,在某个时刻发生了错误,并且所有数据库都被分配了相同的连接字符串。这就是为什么一个数据库工作而另一个数据库不工作的原因。
我指的是这个特定时刻:
我想对大家提出的建议表示感谢;现在我对它的工作原理有了更好的理解。