.net核心实体框架(EF Core)表命名约定

时间:2016-09-16 22:00:49

标签: c# entity-framework entity-framework-core

.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来更改生成的表名。

但是,我需要的是一种以全局方式完成它的方法。

4 个答案:

答案 0 :(得分:3)

我知道这个问题很老并且已经得到解答,但是这个 NuGet (EFCore.NamingConventions) 可能很有趣。

这是一个处理命名约定的 NuGet 包

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseNpgsql(...)
        .UseSnakeCaseNamingConvention();

它还支持:

  • UseSnakeCaseNamingConvention:FullName 变成 full_name
  • UseLowerCaseNamingConvention:FullName 变成 fullname
  • UseCamelCaseNamingConvention:FullName 变成 fullName
  • UseUpperCaseNamingConvention: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");
}