System.Data.SqlClient.SqlException: EF- 中的对象名称无效,但在 Table 属性集专有名称中

System.Data.SqlClient.SqlException: Invalid object name in EF- but in Table Attribute set proper name

我创建了class,通过Table属性在数据库中配置相应的table名字"MyTableInfo" Table:

using System.ComponentModel.DataAnnotations.Schema;

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

我在模型 class 中使用 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);
}

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

System.Data.SqlClient.SqlException: Invalid object name 'dbo.MyTableInfoes'

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

如何解决这个问题?

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

中添加相同的属性
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
        modelBuilder.Entity<MyTableInfo>().ToTable("MyTableInfo");

根据默认约定,EF 创建一个 table 名称匹配 属性 name> + 's'(或 'es')——这就是为什么我可以在我的源文件中找不到字符串 MyTableInfoes ...

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

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

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

不要将生成的 table 名称复数化。