最常用方式是用[Column]注解直接指定列名,支持列名和数据库类型双参数,Fluent API配置优先级高于注解,仅影响列名映射不控制是否映射或主键等元数据。

EF Core 中指定列名最常用、最直观的方式就是用 [Column] 注解,它直接写在实体属性上,告诉 EF 这个属性对应数据库里的哪个列名。
基础用法:给单个属性加 Column
当你命名习惯和数据库不一致时(比如 C# 用 Title,数据库要求 title_name),就用它:
public class Blog
{
public int Id { get; set; }
[Column("blog_title")] // 映射到数据库列 blog_title
public string Title { get; set; }
[Column("created_at")]
public DateTime CreatedTime { get; set; }}
这样 EF 在生成迁移(migration)或执行查询时,都会把 Title 当作 blog_title 来处理。
进阶用法:同时指定列名和数据类型
[Column] 支持两个参数:列名 + 数据库类型(TypeName),适合需要精确控制字段定义的场景:
-
[Column("price")]→ 只改列名 -
[Column("price", TypeName = "decimal(18,2)")]→ 列名 + 精确类型 -
[Column("remark", TypeName = "nvarchar(500)")]→ 支持 SQL Server 的 Unicode 字符串
注意:TypeName 值是数据库原生类型,不同数据库写法略有差异(如 PostgreSQL 用 text,MySQL 用 varchar(255))。
和 Fluent API 的关系:谁优先?
如果同一个属性既用了 [Column],又在 OnModelCreating 里调用 HasColumnName(),Fluent API 的配置会覆盖注解。也就是说:
- 简单项目、少量字段 → 用
[Column]更快更直观 - 统一风格(如全部转 snake_case)、批量配置 → 用 Fluent API 遍历所有属性更省事
- 需要运行时动态决定列名 → 只能靠 Fluent API(注解是编译期固定的)
注意事项
别忘了这些小细节,否则容易踩坑:
-
[Column]只影响列名,不影响是否映射 —— 如果想完全跳过某属性,要用[NotMapped]或Ignore() - 主键、外键、索引等其他元数据(如
IsPrimaryKey)不能靠[Column]设置,得用[Key]、[ForeignKey]或 Fluent API - 列名区分大小写与否,取决于底层数据库(如 PostgreSQL 默认小写,SQL Server 通常不敏感),EF 不做额外转换
基本上就这些。用好 [Column] 能让你的实体和数据库结构对齐得更干净,尤其对接老库或跨团队协作时特别管用。










