ASP.NET MVC中EF自动复数化表名引发SqlException问题求助
问题原因&解决办法:Entity Framework 默认复数表名约定搞的鬼
哈哈,这个坑我刚学EF的时候也踩过!其实问题出在Entity Framework(EF)Code First的默认命名约定上:EF默认会把实体类名称的复数形式作为对应的数据库表名。你的实体类是TblDepartment,EF就自动去数据库里找TblDepartments表了——哪怕你代码里全写的单数表名,它也会自己按约定改复数,这就是为什么报错提示找不到dbo.TblDepartments的原因。
你把数据库表改名为TblDepartments后恢复正常,就是刚好迎合了EF的这个默认约定,所以它能正确匹配到表了。如果不想改数据库表名,有几种更优雅的解决方式:
1. 用DataAnnotation特性直接指定表名
在你的TblDepartment实体类上添加[Table]特性,明确告诉EF对应的表名:
using System.ComponentModel.DataAnnotations.Schema; namespace WebApp1.Models { [Table("TblDepartment")] // 这里指定表名 public class TblDepartment { // 你的实体属性示例 public int DepartmentId { get; set; } public string DepartmentName { get; set; } // ...其他属性 } }
2. 用Fluent API在DbContext里配置
如果不想在实体类上添加特性,可以在你的DbContext的OnModelCreating方法里配置表映射:
using System.Data.Entity; using WebApp1.Models; public class AppDbContext : DbContext { // DbSet定义 public DbSet<TblDepartment> TblDepartments { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 为TblDepartment实体指定表名 modelBuilder.Entity<TblDepartment>().ToTable("TblDepartment"); base.OnModelCreating(modelBuilder); } }
3. 全局关闭复数表名约定
如果你的项目里所有数据库表都是单数命名,不想逐个配置,可以直接关闭EF的复数表名约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 移除复数表名约定 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); base.OnModelCreating(modelBuilder); }
这样设置后,EF就会直接用实体类的原名去匹配数据库表,不会自动加复数后缀了。
内容的提问来源于stack exchange,提问作者Waller
相关产品推荐
相关产品推荐

