前言
C# 编码规范中,类和属性都是大写驼峰命名风格(PascalCase / UpperCamelCase),而在数据库中我们往往使用小写蛇形命名(snake_case),在默认情况下,EFCore会把原始的类名和属性名直接映射到数据库,这不符合数据库的命名规范。
为了符合命名规范,而且也为了看起来更舒服,需要自己做命名转换处理。
FreeSQL的命名转换功能
FreeSQL 内置了很方便的命名风格转换功能,只需要设置 UseNameConvert
就可以实现 Pasca Case 到 snake_case 的转换。
var fsql = new FreeSqlBuilder()
.UseConnectionString(DataType.MySq服务器托管网l, 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 行为
EFCo服务器托管网re 有非常丰富的功能,修改表名和字段名当然也不在话下。
重写 DbContext
的 OnModelCreating
方法就行
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的名称做转换。
搞定~
参考资料
- https://andrewlock.net/customising-asp-net-core-identity-ef-core-naming-conventions-for-postgresql/
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
引言 由于最近比较忙活没时间学习新东西,现在得空想着能不能好好整理出一些有用的东西,让记忆深刻一点,免得到时候实习找工作面试的时候一问三不知,也希望大家能指正出错误和对大家有点帮助,一起进步,加油奥里给!!! 那么废话不多说直接进入正题,如果觉得可以家人们给个…