.net核心实体框架(EF Core)表命名约定复数到单/简单/下划线
作为Plural PascalCase
对表名的命名约定的粉丝,我对 EF核命名表public class SourceType {
...
的方式感到不舒服。
模型
public class ApplicationDbContext : DbContext {
public DbSet<SourceType> SourceTypes { get; set; }
...
的DbContext
SourceTypes
这将创建名为[table('source_type')]
的表格(PascalCase和Plural)
我知道我可以在模型类中使用ModelBuilder
来更改生成的表名。
但是,我需要的是一种以全局方式完成它的方法。
答案 0 :(得分:3)
我知道这个问题很老并且已经得到解答,但是这个 NuGet (EFCore.NamingConventions) 可能很有趣。
这是一个处理命名约定的 NuGet 包
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseNpgsql(...)
.UseSnakeCaseNamingConvention();
它还支持:
FullName
变成 full_name
FullName
变成 fullname
FullName
变成 fullName
FullName
变成 FULLNAME
答案 1 :(得分:2)
简而言之
使用扩展方法扩展ModelBuilder,执行一些正则表达式,然后调用DbContext中的方法
详情
为public static class ModelBuilderExtensions
{
public static void SetSimpleUnderscoreTableNameConvention(this ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
Regex underscoreRegex = new Regex(@"((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)");
entity.Relational().TableName = underscoreRegex.Replace(entity.DisplayName(), @"_$1$2").ToLower();
}
}
}
类
DbContext
在public class ApplicationDbContext : DbContext
{
public DbSet<SourceType> SourceTypes { get; set; }
...
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
...
builder.SetSimpleUnderscoreTableNameConvention();
}
}
{{1}}
我希望这会帮助像我这样的开发人员不浪费时间寻找解决方案。 :)
答案 2 :(得分:1)
Faraj的answer无效ThreeCapitalWords
,结果为three_capitalwords
。
以下是我的解决方案,基于this answer:
/// <summary>
///
/// </summary>
/// <param name="preserveAcronyms">If true, 'PrepareXXRecord' converted to 'prepare_xx_record',
/// otherwise to 'prepare_xxrecord'</param>
public static void SetSimpleUnderscoreTableNameConvention(this ModelBuilder modelBuilder, bool preserveAcronyms)
{
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
var underscored = AddUndercoresToSentence(entity.DisplayName(), preserveAcronyms);
entity.Relational().TableName = underscored.ToLower();
}
}
private static string AddUndercoresToSentence(string text, bool preserveAcronyms)
{
if (string.IsNullOrWhiteSpace(text))
return string.Empty;
var newText = new StringBuilder(text.Length * 2);
newText.Append(text[0]);
for (int i = 1; i < text.Length; i++)
{
if (char.IsUpper(text[i]))
if ((text[i - 1] != '_' && !char.IsUpper(text[i - 1])) ||
(preserveAcronyms && char.IsUpper(text[i - 1]) &&
i < text.Length - 1 && !char.IsUpper(text[i + 1])))
newText.Append('_');
newText.Append(text[i]);
}
return newText.ToString();
}
它还会将首字母缩写词PrepareXXRecord
转换为prepare_xx_record
。
答案 3 :(得分:0)
TL&DR:SnakeCase 解决方案不适用于身份框架;使用以下方法手动创建它们;
说明:SnakeCase() 函数适用于大多数问题。但是,有时此方法无法正确设置数据库表的格式。一个非常流行的例子是身份框架。在这些情况下,建议您手动命名表;
修复:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Configure default schema
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("asp_net_users");
modelBuilder.Entity<IdentityUserToken<string>>().ToTable("asp_net_user_tokens");
modelBuilder.Entity<IdentityUserLogin<string>>().ToTable("asp_net_user_logins");
modelBuilder.Entity<IdentityUserClaim<string>>().ToTable("asp_net_user_claims");
modelBuilder.Entity<IdentityRole>().ToTable("asp_net_roles");
modelBuilder.Entity<IdentityUserRole<string>>().ToTable("asp_net_user_roles");
modelBuilder.Entity<IdentityRoleClaim<string>>().ToTable("asp_net_role_claims");
}