EF Core Column注解怎么用 EF Core指定列名方法

来源:这里教程网 时间:2026-02-21 17:35:11 作者:

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]
能让你的实体和数据库结构对齐得更干净,尤其对接老库或跨团队协作时特别管用。

相关推荐