从生成的表中检索数据时,对象名称“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”。
关于此错误的原因是名为“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; } }