无效的对象名称“dbo”.表名“,从生成的表中检索数据

本文关键字:数据 检索 表名 对象 dbo 无效 | 更新日期: 2023-09-27 18:33:30

我首先使用实体框架代码来创建我的表。请注意 - 创建表,而不是数据库,因为我正在托管环境中工作,并且我没有允许创建数据库的用户。

提交数据库更新工作正常,但检索数据会出现异常:

异常详细信息:System.Data.SqlClient.SqlException:无效的对象名称 'dbo。活动主持人'。

我读到发生这种情况是因为我没有使用 EF Code First 来创建数据库。这很好,但是我该如何优雅地解决这个问题?

所有生成的表都没有像 dbo 这样的前缀。像这样的解决方案不起作用,而且一点也不优雅:

[Table("EventHosts", Schema = "")]

无效的对象名称“dbo”.表名“,从生成的表中检索数据

好的,对我来说,问题是我有一个名为 dbo.UserState 的表,并且在 C# 中,EF 由于复数而试图访问dbo.UserStates

解决方案是将Table属性放在类之上并指定确切的表名:

[Table("UserState")]
public class UserState
{
    [Key]
    public int UserId { get; set; }
}

要回答您的第一个问题:使用您的托管服务提供商为您创建的架构。

回答您的第二个问题:否,目前没有直接的方法可以全局更改默认架构,因为您无法修改现有约定或创建新约定。您可以尝试破解它。

例如,可以重写OnModelCreating并使用反射来获取上下文中声明的所有DbSet<>属性。然后,您只需对这些属性使用简单循环,并使用属性名称作为表名和自定义架构创建ToTable映射调用。需要一些反思才能完成这项工作。

或者,您可以尝试通过实现自定义约定来执行一些可重用的方法。你可以找到许多关于将自己的约定与 EF 配合使用的不同文章。一些例子:

  • 实体框架代码优先 v 4.1 中的自定义约定
  • 实体框架 4.1 最终版中的约定

我未经测试的高级想法是遵循相同的原则并创建程序集级别属性,该属性将由约定机制处理并应用于您的所有实体。

尝试在 SQL SERVER 中将默认架构名称设置为"dbo"。

http://msdn.microsoft.com/en-us/library/ms173423.aspx

此错误的原因是名为"EventHosts"的表可能不存在,或者该表已重命名为其他名称,请检查。.

https://stackoverflow.com/a/12808316/3069271

我有同样的问题,这是映射和数据库之间的复数问题。