前言

C# 编码规范中,类和属性都是大写驼峰命名风格(PascalCase / UpperCamelCase),而在数据库中我们往往使用小写蛇形命名(snake_case),在默认情况下,EFCore会把原始的类名和属性名直接映射到数据库,这不符合数据库的命名规范。

为了符合命名规范,而且也为了看起来更舒服,需要自己做命名转换处理。

FreeSQL的命名转换功能

FreeSQL 内置了很方便的命名风格转换功能,只需要设置 UseNameConvert 就可以实现 Pasca Case 到 snake_case 的转换。

var fsql = new FreeSqlBuilder()
.UseConnectionString(DataType.MySql, Default.Value)
.UseAutoSyncStructure(true)
.UseNameConvert(NameConvertType.PascalCaseToUnderscoreWithLower)
.UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
.Build();

EFCore 没有内置这个功能,需要我们自行实现。

使用正则实现命名风格转换

使用正则表达式可以实现这个功能

这里来写一个扩展方法

public static class StringExt {
public static string ToSnakeCase(this string input) {
if (string.IsNullOrEmpty(input)) {
return input;
} var startUnderscores = Regex.Match(input, @"^_+");
return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLower();
}
}

这个方法会在每个小写字母/数字与大写字母之间添加下划线,并把整个字符串转换为小写。

修改 EFCore 行为

EFCore 有非常丰富的功能,修改表名和字段名当然也不在话下。

重写 DbContextOnModelCreating 方法就行

public class AppDbContext : DbContext {
// ... protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly); // CamelCase to SnakeCase
foreach (var entity in modelBuilder.Model.GetEntityTypes()) {
// Replace table names
if (!string.IsNullOrWhiteSpace(entity.GetTableName())) {
entity.SetTableName(entity.GetTableName()!.ToSnakeCase());
} // Replace column names
foreach (var property in entity.GetProperties()) {
property.SetColumnName(property.GetColumnName().ToSnakeCase());
} foreach (var key in entity.GetKeys()) {
if (!string.IsNullOrWhiteSpace(key.GetName())) {
key.SetName(key.GetName()!.ToSnakeCase());
}
} foreach (var key in entity.GetForeignKeys()) {
if (!string.IsNullOrWhiteSpace(key.GetConstraintName())) {
key.SetConstraintName(key.GetConstraintName()!.ToSnakeCase());
}
} foreach (var index in entity.GetIndexes()) {
if (!string.IsNullOrWhiteSpace(index.GetDatabaseName())) {
index.SetDatabaseName(index.GetDatabaseName()!.ToSnakeCase());
}
}
}
}
}

以上代码会对表名、列名、key、index的名称做转换。

搞定~

参考资料

Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格的更多相关文章

  1. ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取

    前文索引:ASP.NET Core教程[二]从保存数据看Razor Page的特有属性与服务端验证ASP.NET Core教程[一]关于Razor Page的知识 实体字段属性 再来看看我们的实体类 ...

  2. 在CentOS7 开发与部署 asp.net core app笔记

    原文:在CentOS7 开发与部署 asp.net core app笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lihongzhai/art ...

  3. ASP.Net Core开发(踩坑)指南

    ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...

  4. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  5. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  6. ASP.NET Core 开发 - Entity Framework (EF) Core

    EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...

  7. 2月送书福利:ASP.NET Core开发实战

    大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...

  8. [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件

    本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...

  9. ASP.NET Core 开发-中间件(Middleware)

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

  10. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

随机推荐

  1. celery笔记八之数据库操作定时任务

    本文首发于公众号:Hunter后端 原文链接:celery笔记八之数据库操作定时任务 前面我们介绍定时任务是在 celery.py 中的 app.conf.beat_schedule 定义,这一篇笔记 ...

  2. 谷歌语法的基础知识&FOFA

    谷歌语法 谷歌语法基础符号: "xxx":表示完全匹配,即关键字不能分开,顺序也不能变 +:"xxx"+www.baidu.com  搜索xxx与baidu.c ...

  3. only-office以Docker方式安装使用

    目录 安装Docker 安装 配置Docker 验证docker是否正常 安装only-office server 系统需求 创建数据目录 启动docker容器 开放防火墙端口 可配置的参数 使用文档 ...

  4. 深度学习(四)——torchvision中数据集的使用

    一. 科研数据集 下载链接: https://pytorch.org/vision/stable/index.html 本文中我们使用的是\(CIFAR\)数据集 二.CIFAR10数据集详解 具体网 ...

  5. Hugging News #0724: Llama 2 登陆 Hugging Face、AI 开源游戏竞赛获奖选手公布!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  6. Django reset framework: 序列化

    序列化与反序列化 将模型转换为json 称之为 序列化 将json转换为模型 称之为 反序列化 何时进行序列化与反序列化 序列化:当后端将数据库中信息取出返回给前端时,要进行序列化操作 反序列化:当需 ...

  7. 本地连接阿里云上的mysql centos

    首先写下原因: 未让3306端口通过防火墙 1.  检查端口是否被防火墙挡住 telnet ip地址 3306 在windows中打开telnet应用, 参考:https://www.cnblogs. ...

  8. [windows]远程桌面失败提示CredSSP加密修正

    前言 windows远程桌面失败,提示"CredSSP加密--" 远程桌面服务器的系统版本:Windows Server 2016 本地电脑的系统版本:Windows 10 方式1 ...

  9. Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs

    目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改 Hi3798MV200 恩兔N2 NS ...

  10. Nginx深入:nginx功能模块、目录结构及配置文件详解

    Nginx功能模块说明 1.Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Event ...