我创建了一个类,通过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
的原因。。。