Ale*_*man 5 postgresql entity-framework entity-framework-core
我面临的问题是 pgAdmin 4 中的 SQL 查询。
实体框架(包括其核心版本)将表和列的名称大写。
这意味着你的 SQL 将类似于
select e."Id", e."Text" from "Entries" e
where e."Text" like '%implicated%'
Run Code Online (Sandbox Code Playgroud)
我在谷歌上搜索防止实体框架大写名称的方法,但没有找到太多信息。
是否有解决方法可以避免将表名和列名用引号引起来?
提前致谢!
默认情况下,postgres 将所有表名、列名保存为小写。
某些数据库似乎不需要对 EF Core 进行任何配置,即可将应用程序中的 Camel 大小写名称映射到数据库中的不区分大小写的名称。例如,使用 MS SQL Server,您可以使用 CamelCased 来使用应用程序实体,但是在数据库中您无需对它们进行大小写,并且一切正常。
对于 Postgres,情况似乎并非如此,因此configuration
需要一些。
Npgsql 推荐这个 nuget 包EFCore.NamingConventions,它提供与 @Alex Herman 的答案类似的功能。尽管您不必对每个属性调用该方法,但您只需使用它一次。
有两个地方可以使用它
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseNpgsql(...)
.UseLowerCaseNamingConvention();
Run Code Online (Sandbox Code Playgroud)
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkNpgsql().AddDbContext<DilaDbContext>(opt =>
opt.UseNpgsql(
Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly("NameOfAssembly"))
.UseLowerCaseNamingConvention() // <======== HERE
...
Run Code Online (Sandbox Code Playgroud)
从 3.0.0 开始,您可以使用 EFCore.NamingConventions 插件自动将所有表和列名称设置为 Snake_case:
还有一些其他的命名约定,我使用小写命名约定,因为这是我用得最多的
他们提供这些约定
UseSnakeCaseNamingConvention
: FullName 变为 full_nameUseLowerCaseNamingConvention
: FullName 变为全名UseUpperCaseNamingConvention
: FullName 变为 FULLNAME可能不要使用大写字母,因为数据库对象名称中的大写字母会导致 EF 配置需要引号
轻松完成!
转到OnModelCreating
方法。
你需要一个扩展方法(下面分享代码)
modelBuilder.NamesToSnakeCase();
Run Code Online (Sandbox Code Playgroud)
创建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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到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();
}
Run Code Online (Sandbox Code Playgroud)
删除数据库,重新创建迁移,然后运行dotnet ef database update
- bingo!
归档时间: |
|
查看次数: |
6201 次 |
最近记录: |