经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格
来源:cnblogs  作者:程序设计实验室  时间:2023/10/11 16:12:50  对本文有异议

前言

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

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

FreeSQL的命名转换功能

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

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

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

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

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

这里来写一个扩展方法

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

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

修改 EFCore 行为

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

重写 DbContextOnModelCreating 方法就行

  1. public class AppDbContext : DbContext {
  2. // ...
  3. protected override void OnModelCreating(ModelBuilder modelBuilder) {
  4. base.OnModelCreating(modelBuilder);
  5. modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
  6. // CamelCase to SnakeCase
  7. foreach (var entity in modelBuilder.Model.GetEntityTypes()) {
  8. // Replace table names
  9. if (!string.IsNullOrWhiteSpace(entity.GetTableName())) {
  10. entity.SetTableName(entity.GetTableName()!.ToSnakeCase());
  11. }
  12. // Replace column names
  13. foreach (var property in entity.GetProperties()) {
  14. property.SetColumnName(property.GetColumnName().ToSnakeCase());
  15. }
  16. foreach (var key in entity.GetKeys()) {
  17. if (!string.IsNullOrWhiteSpace(key.GetName())) {
  18. key.SetName(key.GetName()!.ToSnakeCase());
  19. }
  20. }
  21. foreach (var key in entity.GetForeignKeys()) {
  22. if (!string.IsNullOrWhiteSpace(key.GetConstraintName())) {
  23. key.SetConstraintName(key.GetConstraintName()!.ToSnakeCase());
  24. }
  25. }
  26. foreach (var index in entity.GetIndexes()) {
  27. if (!string.IsNullOrWhiteSpace(index.GetDatabaseName())) {
  28. index.SetDatabaseName(index.GetDatabaseName()!.ToSnakeCase());
  29. }
  30. }
  31. }
  32. }
  33. }

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

搞定~

扩展:使用插件实现名称转换

2023-10-10 补充: 本文在博客发表之后,有同学分享了 EFCore.NamingConventions 这个插件,可以很方便的实现命名风格转换

项目地址: https://github.com/efcore/EFCore.NamingConventions

使用方式

先安装 EFCore.NamingConventions 这个nuget包

然后重写 DbContext 的 OnConfiguring 方法

  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
  2. base.OnConfiguring(optionsBuilder);
  3. optionsBuilder.UseSnakeCaseNamingConvention();
  4. }

一行代码就可以实现名称转换

这个插件同时支持多种风格的转换,调用不同的扩展方法即可

  • UseSnakeCaseNamingConvention: FullName becomes full_name
  • UseLowerCaseNamingConvention: FullName becomes fullname
  • UseCamelCaseNamingConvention: FullName becomes fullName
  • UseUpperCaseNamingConvention: FullName becomes FULLNAME
  • UseUpperSnakeCaseNamingConvention: FullName becomes FULL_NAME

参考资料

原文链接:https://www.cnblogs.com/deali/p/17751279.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号