4

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

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

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

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

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

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

5 回答 5

5

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

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

[Table("UserState")]
public class UserState
{
    [Key]
    public int UserId { get; set; }
}
于 2018-05-31T09:40:17.520 回答
2

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

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

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

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

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

于 2012-05-07T09:47:07.287 回答
0

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

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

于 2012-05-07T10:04:37.183 回答
0

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

于 2014-11-07T13:40:41.217 回答
0

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

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

于 2016-10-06T18:54:09.633 回答