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

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

提交数据库更新工作正常,但检索数据会产生exception:

exception详细信息:System.Data.SqlClient.SqlException:无效的对象名称’dbo.EventHosts’。

我读过它发生了,因为我没有使用EF Code First来创建数据库。 那很好,但我如何优雅地解决这个问题呢?

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

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

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

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

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

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

  • entity framework代码中的自定义约定第一版v 4.1
  • entity framework4.1最终的公约

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

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

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

关于此错误的原因是名为“EventHosts”的表可能不存在或该表重命名为其他名称请检查…

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

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

好吧,对我来说问题是我有一个名为dbo.UserState的表,在C#代码中,EF Code First试图访问dbo.UserStates (因为多元化)。 解决方案是将Table属性放在类之上并指定确切的表名:

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