实体框架和PostgreSQL:引号问题

时间:2018-06-14 17:48:33

标签: postgresql entity-framework entity-framework-core

我面临的问题是pgAdmin 4中的SQL查询。

实体框架(包括其核心版本)将表和列的名称大写。

这意味着您的SQL看起来像

[Column("NewColumnName")]

我正在谷歌搜索阻止实体框架资本化名称的方式,但没有发现太多。

是否有一种解决方法可以避免将表名和列名包装在引号中?

提前致谢!

3 个答案:

答案 0 :(得分:2)

对于EF Core 3及更高版本

默认情况下,postgres将所有表名和列名保存为小写。

某些数据库似乎不需要使用EF Core进行任何配置,即可将应用程序中的驼峰式名称映射到数据库中不区分大小写的名称。例如,对于MS SQL Server,您可以将应用程序实体与CamelCased一起使用,但是在数据库中则不对它们进行大小写检查,一切正常。

对于Postgres似乎并非如此,因此需要configuration

Npgsql recommend这个nuget软件包EFCore.NamingConventions,其功能类似于@Alex Herman的答案。尽管不必在每个属性上都调用该方法,但是只需使用一次即可。

您可以在两个地方使用它

1。在您的DbContext.cs

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

2。或在您的Starup.cs中

public void ConfigureServices(IServiceCollection services)
{
   services.AddEntityFrameworkNpgsql().AddDbContext<DilaDbContext>(opt => 
       opt.UseNpgsql(
           Configuration.GetConnectionString("DefaultConnection"), 
           b => b.MigrationsAssembly("NameOfAssembly"))
       .UseLowerCaseNamingConvention() // <======== HERE
   ...

Npgsql.org

从3.0.0开始,您可以使用EFCore.NamingConventions插件自动将所有表和列名设置为snake_case:

还包括其他一些命名约定,我使用了小写的命名约定,因为这是我使用最多的

他们提供了这些约定

  • UseSnakeCaseNamingConvention:FullName变为full_name
  • UseLowerCaseNamingConvention:FullName变为全名
  • UseUpperCaseNamingConvention:FullName变为FULLNAME

可能不使用大写字母,因为它在数据库对象名称中使用大写字母,导致EF配置要求使用引号

答案 1 :(得分:0)

容易完成!


转到OnModelCreating方法。

您需要扩展方法(下面共享代码)

modelBuilder.NamesToSnakeCase();

创建ModelBuilderExtensions类并粘贴以下内容:

public static void NamesToSnakeCase(this ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        // Replace table names
        entity.Relational().TableName = entity.Relational().TableName.ToSnakeCase();

        // Replace column names            
        foreach (var property in entity.GetProperties())
        {
            property.Relational().ColumnName = property.Name.ToSnakeCase();
        }

        foreach (var key in entity.GetKeys())
        {
            key.Relational().Name = key.Relational().Name.ToSnakeCase();
        }

        foreach (var key in entity.GetForeignKeys())
        {
            key.Relational().Name = key.Relational().Name.ToSnakeCase();
        }

        foreach (var index in entity.GetIndexes())
        {
            index.Relational().Name = index.Relational().Name.ToSnakeCase();
        }
    }
}

您可以看到ToSnakeCase扩展方法-在StringExtensions类中:

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();
}

删除数据库,重新创建迁移,然后运行dotnet ef database update-宾果游戏!

enter image description here

答案 2 :(得分:0)

仅使用小写的simbols创建表和字段。