首页 > 编程语言 >Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格

Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格

时间:2023-10-09 11:34:26浏览次数:36  
标签:Core Asp string EFCore entity ToSnakeCase key var

前言

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的名称做转换。

搞定~

参考资料

标签:Core,Asp,string,EFCore,entity,ToSnakeCase,key,var
From: https://www.cnblogs.com/deali/p/17751279.html

相关文章

  • 造轮子之asp.net core identity
    在前面我们完成了应用最基础的功能支持以及数据库配置,接下来就是我们的用户角色登录等功能了,在asp.netcore中原生Identity可以让我们快速完成这个功能的开发,在.NET8中,asp.netcoreidentity支持了WebApi的注册登录。这让我们在WebApi中可以更爽快的使用。安装包首先我们需要安......
  • NetCore Ocelot 之 Authorization
    Ocelotsupportsclaimsbasedauthorizationwhichisrunpostauthentication.ThismeansifouhavearouteyouwanttoauthorizeyoucanaddthefollowingtoyouRouteconfiguration."RouteClaimsRequirement":{"client_role":......
  • vasp5.4.4+vaspkit安装
    vasp用gnu编译安装是最方便的,下面这个教程非常完整好用vasp-GNU注意看下方评论,第7步更改第33行处,需要删掉-L。vaspkit从sourceforge下载vaspkit打开官网后,右键download获取直链用wget下载即可。解压后运行./setup.sh最后vim~/.vaspkit更改赝势文件路径即可。赝势路径......
  • Aspera Faspex RCE后渗透利用
    引言本文介绍了常规AsperaFaspex组件RCE后如何利用数据库并登录后台的简单后渗透利用,常见的RCENday例如:CVE-2022-47986。维持权限RCE通过反弹shell命令,获取ncshell,但此时shell并不是完全交互式的,并且维持权限不方便,不利用后续的利用,因此需要部署一个完全交互式shell木马,可......
  • NetCore Ocelot 之 Qos
    QosqualityofserviceOcelotsupportsoneQoscapabilityatthecurrenttime.YoucansetonaperRoutebasisifyouwanttouseacircuitbreakerwhenmakingrequeststoadownstreamservice.Thisusesanawesome.NETlibrarycalledPolly.Thefirstthi......
  • NetCore Ocelot 之 Load Balancer
    OcelotcanloadbalanceacrossavailabledownstreamservicesforeachRoute.ThismeansyoucanscaleyourdownstreamservicesandOcelotcanusethemeffectively.TheTypeofloadbalanceravailbleare:  LeastConnection -trackswhichservicearedeal......
  • NetCore Ocelot 之 Authentication
    InordertoauthenticateRoutesandsubsequentlyuseanyofOcelot'sclaimsbasedfeaturessuchasauthorizationormodifyingtherequestwithvaluesfromthetoken.UsersmustregisterauthenticationservicesintheirStartup.csasusualbuttheypr......
  • Asp-Net-Core开发笔记:快速在已有项目中引入EFCore
    前言很多项目一开始选型的时候没有选择EFCore,不过EFCore确实好用,也许由于种种原因后面还是需要用到,这时候引入EFCore也很方便。本文以StarBlog为例,StarBlog目前使用的ORM是FreeSQL,引入EFCore对我来说最大的好处是支持多个数据库,如果是FreeSQL的话,服务注册的时候是单......
  • .net core读取Response.Body
    读取请求体流的demopublicstaticasyncTask<string>GetBodyForm(thisHttpContexthttp){varcontent=string.Empty;varrequest=http.Request;try{request.Body.Position=......
  • NetCore Ocelot 之 Rate Limiting
    Ocelotsupportsratelimitingofupstreamrequestssothatyourdownstreamservicesdonotbecomeoverloaded.OKsotogetratelimitingworkingforaRouteyouneedtoaddthefollowingjsontoit."RateLimitOptions":{"ClientWhi......