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

时间:2012-05-06 18:44:35

标签: c# .net sql-server entity-framework ef-code-first

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

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

  

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

好吧,对我来说问题是我有一个名为dbo.UserState的表,并且在C#EF因为多元化而试图访问dbo.UserStates

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

我有同样的问题,它是映射和db之间的多元化问题。