EF Core(Code First)是否有唯一约束的数据注解?含EF Core 2版本问询
Entity Framework Core Code First 唯一约束的数据注解说明
嘿,刚好对这个问题门儿清,我来给你掰扯得明明白白:
先看EF Core整体支持情况
从EF Core 3.0及更高版本开始,官方提供了直接通过数据注解配置唯一约束的方式——用[Index]注解搭配IsUnique = true参数就行。举个实体类的例子:
public class User { public int Id { get; set; } // 给Email字段配置唯一约束 [Index(nameof(Email), IsUnique = true)] public string Email { get; set; } public string Username { get; set; } }
如果需要多个字段组合成唯一键(复合唯一约束),也能这么写:
[Index(nameof(Username), nameof(Email), IsUnique = true)] public class User { public int Id { get; set; } public string Email { get; set; } public string Username { get; set; } }
重点说EF Core 2.x的Code First模式
这里必须划重点:EF Core 2.x版本没有支持唯一约束的数据注解!
虽说EF Core 2里也有[Index]注解,但它压根儿没有IsUnique这个参数——这个参数是EF Core 3.0才新增的功能。那EF Core 2里要加唯一约束怎么办?只能靠两种方式:
- 用Fluent API配置:在你的DbContext的
OnModelCreating方法里手动配置,比如:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 单个字段的唯一约束 modelBuilder.Entity<User>() .HasIndex(u => u.Email) .IsUnique(); // 多个字段组合的复合唯一约束 modelBuilder.Entity<User>() .HasIndex(u => new { u.Username, u.Email }) .IsUnique(); }
- 手动修改迁移脚本:当你生成迁移文件后,打开
Up方法,在创建索引的代码里手动加上unique: true参数,比如:
migrationBuilder.CreateIndex( name: "IX_Users_Email", table: "Users", column: "Email", unique: true);
总结一下:EF Core 2.x的Code First没有对应的唯一约束数据注解,必须用Fluent API或者手动修改迁移脚本实现;3.0及以上版本可以直接用带IsUnique参数的[Index]注解搞定。
内容的提问来源于stack exchange,提问作者Elnoor
相关产品推荐
相关产品推荐

