EF Core 中配置唯一约束应优先使用 HasIndex().IsUnique(),它稳定、直观且支持单列、多列及带过滤条件的唯一索引;HasAlternateKey 易引发更新异常,仅适用于需作为外键引用的场景;数据注解 [Index] 简洁但灵活性低。
EF Core 中配置唯一约束,核心目标是让数据库层面强制保证某字段或字段组合不重复。最常用且推荐的方式是 HasIndex().IsUnique(),而 HasAlternateKey 虽然语义上更贴近“备用唯一标识”,但实际使用中容易踩坑——比如迁移不生成约束、运行时行为受限等。
这是最稳定、最直观、也最符合数据库原生语义的做法。它会在数据库中创建 UNIQUE 索引,支持空值(NULL 允许多个,除非加 NOT NULL 约束),且迁移能正确识别并生成 SQL。
OnModelCreating 中写HasAlternateKey 的设计初衷是定义“可作为外键引用的目标键”,它隐含两个关键行为:一是自动添加唯一索引,二是将对应属性标记为 不可更新(concurrency token 或只读语义)。这会导致 SaveChanges 失败或意外抛异常,尤其在更新含备用键的实体时。
AK_Entity_Property,不易自定义
用 [Index] 特性声明,适合快速原型或简单场景:
OnModelCreating
nameof 拼接,可读性差[Index] 是 EF Core 5+ 才支持的特性,旧版本不识别唯一约束是否生效,不能只看 C# 代码,要确认三件事:
dotnet ef migrations add AddUniqueIndex 后,检查生成的迁移文件中是否有 CreateIndex 且含 unique: true
sys.indexes(SQL Server)或 pg_indexes(PostgreSQL),确认索引类型为 UNIQUE基本上就这些。用 HasIndex().IsUnique() 就够了,清晰、可控、少陷阱。