我使用 Entity Framework 7 和 Npgsql 适配器。 EF生成的Sql看起来像
SELECT "r"."Id", "r"."Name" FROM "public"."Role" AS "r"
它在 Postgres 中不起作用,因为区分大小写的策略。为了使其工作,我需要编写创建表脚本
CREATE TABLE "Role" (
"Id" int,
"Name" varchar(200)
);
但它很丑。有没有办法让 EF 生成不带引号或小写命名风格的脚本?
这是 .NET Core 3.X 的紧凑解决方案 - Net5(可能也适用于 Net6)。这将假设所有表和列均为小写并带引号。如果有人命名与保留关键字(例如:“用户”、“角色”、“默认”、“注释”等)冲突的表/列,您会发现无条件引用很有帮助。
/// <summary>A replacement for <see cref="NpgsqlSqlGenerationHelper"/>
/// to convert PascalCaseCsharpyIdentifiers to alllowercasenames.
/// So table and column names with no embedded punctuation
/// get generated with no quotes or delimiters.</summary>
public class NpgsqlSqlGenerationLowercasingHelper : NpgsqlSqlGenerationHelper
{
//Don't lowercase ef's migration table
const string dontAlter="__EFMigrationsHistory";
static string Customize(string input) => input==dontAlter? input : input.ToLower();
public NpgsqlSqlGenerationLowercasingHelper(RelationalSqlGenerationHelperDependencies dependencies)
: base(dependencies) { }
public override string DelimitIdentifier(string identifier)
=> base.DelimitIdentifier(Customize(identifier));
public override void DelimitIdentifier(StringBuilder builder, string identifier)
=> base.DelimitIdentifier(builder, Customize(identifier));
}
将其插入非常简单:
optionsBuilder.UseNpgsql(...)
.ReplaceService<ISqlGenerationHelper, NpgsqlSqlGenerationLowercasingHelper >();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)