数据库对象命名约定
不同数据库对象的命名约定不同,EF Core 为了适配不同数据库,提供了一些命名约定的配置选项。
常见的命名方法
Naming policy | Original | Converted |
---|---|---|
PascalCase | HelloShop | HelloShop |
CamelCase | HelloShop | helloShop |
SnakeCaseLower | HelloShop | hello_shop |
SnakeCaseUpper | HelloShop | HELLO_SHOP |
KebabCaseLower | HelloShop | hello-shop |
KebabCaseUpper | HelloShop | HELLO-SHOP |
可使用 Humanizr 库将字符串转换为不同的命名风格。
表名使用单数还是复数
EF Core 默认情况下,表名使用单数形式,可以通过约定器或者手动指定复数表名,社区对单数和复数表名的争论一直存在,没有统一的标准,但零度推荐使用单数形式。
手动指定表名和列名
表名
默认情况下,EF Core 使用实体类型的名称作为表名。可以通过重写 OnModelCreating
方法来修改表名:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().ToTable("blogs");
}
列名
默认情况下,EF Core 使用属性名作为列名。可以通过 HasColumnName
方法来修改列名:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.Url).HasColumnName("blog_url");
}
PostgreSQL 命名约定
PostgreSQL 的命名约定采用小写蛇形命名法,即单词之间使用下划线分隔,如 blog_url
,表名使用单数形式。
使用 EFCore.NamingConventions 库
EFCore.NamingConventions 库提供了一些命名约定的配置选项,可以方便地配置表名、列名等。
安装 EFCore.NamingConventions 库
dotnet add package EFCore.NamingConventions
配置命名约定
使用 OnConfiguring 方法配置命名约定:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSnakeCaseNamingConvention();
}
或者在依赖注入容器中配置:
builder.Services.AddDbContext<MyDbContext>(options => options.UseNpgsql().UseSnakeCaseNamingConvention());
修改迁移历史表名
默认情况下,EF Core 在名为 __EFMigrationsHistory 的表中记录哪些迁移已应用到数据库中,从而跟踪这些迁移。 出于各种原因,可能需要自定义此表,以更好地满足你的需求。
options.UseSqlServer(connectionString,x => x.MigrationsHistoryTable("__MyMigrationsHistory", "mySchema"));
https://learn.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/history-table