EF Core 中指定列名最常用、最直观的方式就是用
[Column]注解,它直接写在实体属性上,告诉 EF 这个属性对应数据库里的哪个列名。
基础用法:给单个属性加 Column
当你命名习惯和数据库不一致时(比如 C# 用
Title,数据库要求
title_name),就用它:
public class Blog
{
public int Id { get; set; }
<pre class="brush:php;toolbar:false;">[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]能让你的实体和数据库结构对齐得更干净,尤其对接老库或跨团队协作时特别管用。
