【问题标题】:System.Data.SqlClient.SqlException: Invalid object name in EF- but in Table Attribute set proper nameSystem.Data.SqlClient.SqlException:EF 中的对象名称无效-但在表属性中设置了正确的名称
【发布时间】:2019-10-30 06:19:13
【问题描述】:

我已经创建了类来通过Table属性在数据库中配置相应的表名“MyTableInfo”:

using System.ComponentModel.DataAnnotations.Schema;

[Table("MyTableInfo" , Schema = "dbo")]
public class MyTableInfo
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
}

我在模型类中使用 Fluent API 来添加一些约束:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Answers>()
        .HasMany(e => e.MyTableInfo)
        .WithRequired(e => e.Answers)
        .HasForeignKey(e => e.AnswersId)
        .WillCascadeOnDelete(false);
}

但是当我尝试从表中获取数据时出现异常:

System.Data.SqlClient.SqlException:无效的对象名称“dbo.MyTableInfoes”

但是我的源文件中甚至没有任何带有文本 MyTableInfoes 的字符串!!!

如何解决这个问题?

【问题讨论】:

  • 这可能与某些“复数”设置有关吗?
  • @Marcel - 看起来像这样 - 但为什么“复数”适用于 DataAnnotations.Schema 而不适用于 Fluent API?

标签: c# entity-framework data-annotations ef-fluent-api


【解决方案1】:

原因是 EF 正在为表生成复数名称,有一个选项可以删除该配置。

在您的数据库上下文类中,覆盖以下方法

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

让它不复数生成的表名。

【讨论】:

  • 当然——但我的回答给了其他人关于良好实践的信息,例如不要使用 2 种不同的方法来配置 EF ...
  • 例如,没有多少人知道 Data Annotations Attributes 已受到“复数”设置的影响,而 Fluent API 没有...
  • 有两种不同的东西,一种用于配置整个上下文,它应用于整个上下文,第二种用于仅配置特定表,例如one to many cascade delete convention, Pluralizing table name约定`可以在上下文中设置许多约定,并且您可以对特定表使用流利的 API。 table 属性是用来设置表名的,但不代表默认配置就完事了。如果您使用 fluent API,则意味着您正在专门配置该表架构信息。
【解决方案2】:

原因 - 使用 2 种不同的方法来配置 EF - 数据注释属性和 Fluent API。 只需删除 Table 属性并在 Fluent API 中添加相同的属性:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
        modelBuilder.Entity<MyTableInfo>().ToTable("MyTableInfo");

根据默认约定,EF 创建一个与属性名称匹配的表名> + 's'(或 'es') - 这就是我在源文件中找不到字符串 MyTableInfoes 的原因...

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 2011-02-25
    • 2011-09-18
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多