實體框架7中表和屬性的不區分大小寫的名稱

c# entity-framework entity-framework-core npgsql postgresql

我使用實體框架7與Npgsql適配器。 EF生成的Sql似乎

SELECT "r"."Id", "r"."Name" FROM "public"."Role" AS "r"

它在Postgres中不起作用,因為區分大小寫的策略。為了使它工作,我需要編寫創建表腳本

CREATE TABLE "Role" (
    "Id" int,
    "Name" varchar(200)
);

但它很難看。有沒有辦法讓EF生成沒有引號或小寫命名風格的腳本?

一般承認的答案

有一個很好的理由Npgsql在任何地方生成引號 - 所以你絕對不應該刪除它們(即使它在技術上可能像@natemcmaster所說)。 PostgreSQL會自動將沒有引號的標識符轉換為小寫。實體框架需要能夠將C#屬性映射到數據庫列,但C#屬性區分大小寫;因此,如果你刪除數據庫區分大小寫,那麼你就是在腳下射擊...

除非你有一個真正的問題(除了感覺到的醜陋),你應該保持原樣。


熱門答案

  1. 在NpgsqlSqlGenerationHelper中覆蓋DelimitIdentifier,如下所示:

    public class SqlGenerationHelper : NpgsqlSqlGenerationHelper
    {
        public override string DelimitIdentifier(string identifier) => identifier.Contains(".") ? base.DelimitIdentifier(identifier) : identifier;
    }
    
  2. 使用ReplaceService方法將ISqlGenerationHelper替換為您的類:

    public class MyContext : DbContext
    {
        public virtual DbSet<MyTable> MyTable { get; set; }
    
        public MyContext(DbConnection connection) :
               base(new DbContextOptionsBuilder().UseNpgsql(connection)
                                                 .ReplaceService<ISqlGenerationHelper, SqlGenerationHelper>()
                                                 .Options) 
        { }
    }
    


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因