实体框架和PostgreSQL:引号问题

问题描述 投票:1回答:2

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

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

这意味着您的SQL将看起来像

select e."Id", e."Text" from "Entries" e
where e."Text" like '%implicated%'

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

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

提前致谢!

postgresql entity-framework entity-framework-core
2个回答
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();
}

删除db,重新创建迁移,然后运行dotnet ef database update - bingo!

enter image description here


0
投票

只使用小写符号创建表和字段。

© www.soinside.com 2019 - 2024. All rights reserved.