System.Data.SqlClient.SqlException:EF中的对象名称无效,但在表属性中设置了正确的名称



我创建了一个类,通过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的字符串!!!

如何解决此问题?

原因是EF是为表生成复数名称,可以选择删除该配置。

在DB上下文类中,重写以下方法

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

使其不将生成的表名复数化。

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

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

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

相关内容

  • 没有找到相关文章

最新更新