【问题标题】:EF Fault when retrieving data: wrong table name in SQL检索数据时出现 EF 错误:SQL 中的表名错误
【发布时间】:2013-02-01 13:59:29
【问题描述】:

我有一个简单的edmx,有两张桌子。这些表由一个 Navigation Property 关联。 (一对多)。

当我运行我的代码时,我得到一个 Exception: "Invalid Object Name dbo.Enquiries"

数据库中没有dbo.Enquiries(实际上叫dbo.Enquiry),所以错误本身是不言自明的。 但它在哪里找到该名称,我该如何解决?

已按要求显示代码。

 var foo = (from  d in context.Dealerships
            join e in context.Enquiry
                on d.Id equals e.DealershipId
            where (d.ParentBusinessId == id)
            select d).AsEnumerable();

这是生成的sql。

  foo   {SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[BusinessName] AS [BusinessName]
FROM  [dbo].[Dealerships] AS [Extent1]
INNER JOIN [dbo].[Enquiries] AS [Extent2] ON [Extent1].[Id] = 
[Extent2].[DealershipId]
WHERE [Extent1].[ParentBusinessId] = @p__linq__0}   

但是对于我的生活,我看不到它是在哪里/如何决定将名称 Inquiry 更改为 Inquiries on the inner join。

【问题讨论】:

  • 什么时候运行“哪个”代码?
  • 我没有看到显示代码的任何意义,因为它所做的只是尝试从 2 个表中提取。如果我随后在调试器中进行调查,则主表中的数据在那里,但辅助表中的数据不在那里。调试器中的 SQL 显示它正在寻找错误的表,因此我认为这是其中一位设计师的问题,但我将编辑以显示代码。

标签: c# entity-framework datacontext


【解决方案1】:

找到答案。 Pluralise 仅适用于模型生成。我必须明确告诉我的 DbContext 不要将名称复数(我不敢开始重命名这个数据库,所以我坚持使用的奇怪约定。)

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  }

【讨论】:

  • +1 但您可能会发现,在使用现有数据库时,您可以从使用配置显式指定表名中受益。例如,即使表名不符合 C# 编码标准,您也可以使用符合 C# 编码标准的类名。
【解决方案2】:

尝试从 edmx 中删除表格并在更新模型后。

【讨论】:

  • 恐怕没有任何区别
【解决方案3】:

您似乎正在使用基于模型的开发。如果是这种情况,那么您似乎对模型进行了一些更改,但没有将它们反映到数据库中。

使用从模型生成数据库选项,它会将数据库与模型同步。

【讨论】:

  • 不,数据库已经存在,我从现有数据库生成模型。
  • 你能再试试“从数据库更新模型”吗?
  • 没什么区别,抱歉。
  • edmx 中有一个选项说明是使用复数还是单数数据库名称/实体名称;很可能这在某种程度上无法正常工作。从数据库更新模型时,取消选中复数或单数生成的对象名称。
  • 我已经这样做了,删除了我的 edmx 并重新创建了它。保持勾选框未选中,它仍然会发生。但是,我怀疑这是找到解决方案的正确路线。
【解决方案4】:

尝试关闭 EF 模型的图形视图。 右键单击编辑并在 XML 编辑器中打开。 到表的映射应该在那里,您可以更正它。 或者 如果您在导入/更新后更改了模式,您可以完全删除模型并再次导入模型。
访问模型的代码应该还可以。

【讨论】:

  • 那里的映射似乎是正确的,在整个文件中搜索查询显示没有结果。我已经删除了整个模型,重新启动了 PC,重新创建了它,它仍然存在。我的代码上的调试器显示 context.Enquiry 正在调用表 Enquiries,所以这是一些基本的事情,尤其是当我关闭了复数时..
  • 通过在此线程的其他位置添加代码块来修复问题。我只是无法标记为已回答 2 天。
  • 感谢反馈,我从来不需要 modelBuilder.Conventions.Remove 但会记住。 +1 回答。
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2020-05-18
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多