【问题标题】:Incoherent error: invalid object name不连贯错误:无效的对象名称
【发布时间】:2011-07-05 07:40:32
【问题描述】:

我从我的数据库中重命名了一个表。所以我还重命名了我的实体(从 Favori 到 FavorisAffaire)。编译成功。但是现在,当我运行我的应用程序时,我收到以下错误:

对象名称“dbo.FavorisAffaires”无效

我的解决方案中没有这个 FavorisAffaires!

我有 FavorisAffaire(没有结尾 s)。我怀疑我的解决方案的背景有问题...我已经尝试清理然后重建,但问题仍然存在。

有什么想法吗?

【问题讨论】:

  • 这与 ASP.NET MVC 3 有什么关系?请适当地标记您的问题,在您的情况下,我想您是在谈论实体框架?
  • @Darin:这是一个 ASP.NET MVC3 解决方案。但你是对的,它似乎更具体到实体框架问题。我添加了适当的标签。
  • 你检查过模型吗?在 VS 中打开 EDMX,单击 FavorisAffaire 表并按 Alt+F4(打开属性)。在属性中是实体集名称的字段。对于大多数单词,EF 在表名的末尾添加一个“S”来表示复数。如果对您没有意义,请删除“S”?
  • @Smudge202:哎呀,我忘了提到我首先使用了实体框架代码。我没有任何 EDMX 文件。

标签: .net entity-framework


【解决方案1】:

这就是 EF 默认的行为方式。它使用名称的复数形式。它可以关闭,也可以强制单个实体映射到正确的表,但这一切都取决于您使用的 EF 版本。

编辑:

哎呀,我忘了提到我用过 实体框架代码优先。

是的,您忘记提及问题中非常重要的部分。

有几种方法可以做到这一点。

数据标注:

[Table("FavorisAffaire")]
public class FavorisAffaire
{ ... }

或者流畅的映射:

modelBuilder.Entity<FavorisAffaire>()
            .ToTable("FavorisAffaire");

或删除复数约定(这具有全局范围,因此可以破坏其他现有表的映射)

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

一旦您删除约定,您应该确保 DbSet 的名称是单数:

public DbSet<FavorisAffaire> FavorisAffaire { get; set; }

或者只是重命名您的表格,因为表格应该是复数。

【讨论】:

    【解决方案2】:

    除了 Ladislav Mrnka 的回答之外,我假设您在进行这些更改后还没有重新创建数据库。所以“代码优先”为您的新实体生成了一个表名,以前不存在(准确地说,它可能被命名为“Favoris”)。如果您现在连接到已经具有旧架构的数据库,并且您没有命令 EF 重新创建数据库,它将假定它正在寻找的表 (FavoriAffairs) 存在(它不存在)。

    如果您的“Favoris”表中已有数据,建议您将其重命名为“FavoriAffairs”,否则让 Code First 重新创建数据库。这是通过设置一个特定的数据库初始化器来完成的,这里解释:http://davidhayden.com/blog/dave/archive/2011/04/27/DatabaseInitializersEFCodeFirstDatabaseSetInitializer.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多