无效的对象名称“dbo”.表名“,从生成的表中检索数据
本文关键字:数据 检索 表名 对象 dbo 无效 | 更新日期: 2023-09-27 18:33:30
我首先使用实体框架代码来创建我的表。请注意 - 创建表,而不是数据库,因为我正在托管环境中工作,并且我没有允许创建数据库的用户。
提交数据库更新工作正常,但检索数据会出现异常:
异常详细信息:System.Data.SqlClient.SqlException:无效的对象名称 'dbo。活动主持人'。
我读到发生这种情况是因为我没有使用 EF Code First 来创建数据库。这很好,但是我该如何优雅地解决这个问题?
所有生成的表都没有像 dbo 这样的前缀。像这样的解决方案不起作用,而且一点也不优雅:
[Table("EventHosts", Schema = "")]
好的,对我来说,问题是我有一个名为 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
我有同样的问题,这是映射和数据库之间的复数问题。