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 名称复数化。
我创建了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 名称复数化。