EF Core 中指定表名最常用方式是使用[Table]数据注解,如[Table("t_blog")];也可用Fluent API的ToTable方法,在OnModelCreating中配置,支持动态和批量设置,且ToTable优先级高于[Table]。

EF Core 中指定表名最常用、最直接的方式就是使用 [Table] 数据注解,它写在实体类上,告诉 EF 这个类对应数据库里的哪张表。
用 [Table] 注解指定表名
在实体类顶部加上 [Table("表名")],EF Core 就会把这个类映射到指定的表,而不是默认的复数形式(比如 Blog 类默认建表叫 Blogs)。
示例:
using System.ComponentModel.DataAnnotations.Schema;
[Table("t_blog")]
public class Blog
{
public int Id { get; set; }
public string Url { get; set; }
}
这样迁移生成或自动建表时,就会创建名为 t_blog 的表,而不是 Blogs。
注意:[Table] 支持同时指定架构(schema),比如 [Table("t_blog", Schema = "dbo")] 或 [Table("t_blog", Schema = "sales")],适合多 schema 场景。
Fluent API 方式(ToTable)
如果不想把配置写进实体类(避免业务代码和数据映射耦合),推荐用 Fluent API,在 DbContext.OnModelCreating 里统一配置:
- 单表指定:
modelBuilder.Entity().ToTable("t_blog"); - 带 schema:
modelBuilder.Entity().ToTable("t_blog", "sales"); - 也可以在独立的配置类中调用:
builder.ToTable("t_blog");(配合IEntityTypeConfiguration)
这种方式更灵活,支持运行时动态判断,也方便做批量配置(比如所有表加前缀)。
两种方式能混用吗?
技术上可以,但不建议。
-
[Table]是声明式、静态的,编译期就固定了 -
ToTable是命令式、可编程的,优先级更高 —— 如果两者都写了,ToTable会覆盖[Table] - 混用容易造成维护困惑,尤其团队协作时,建议选一种风格并保持一致
改表名后要注意迁移
已存在数据表的情况下修改表名,EF Core 不会自动重命名旧表,需要手动处理:
- 执行
Add-Migration RenameBlogTable后,打开生成的迁移文件 - 把
DropTable("Blogs")和CreateTable("t_blog")改成RenameTable("Blogs", "t_blog") - 再运行
Update-Database
否则会删旧表、建新表,导致数据丢失。
基本上就这些。用 [Table] 最快上手,用 ToTable 更利于长期维护 —— 看项目规模和团队规范选就行。










