Хранимая процедура Postgresql на .net Core()

#postgresql #entity-framework #.net-core #entity-framework-core

#postgresql #entity-framework #.net-ядро #entity-framework-core

Вопрос:

Я пытаюсь переместить нашу текущую базу данных SQL Server в PostgreSQL с помощью .net Core 2.2.

Я преобразовал все таблицы (ограничения, индекс), представления и хранимые процедуры в Postgre SQL. Я сохранил всю конфигурацию Dbset (за исключением строки подключения) для моделей данных на серверной части.

У меня проблема с запуском хранимой процедуры (в Postgres) в EF Core. Хранимая процедура возвращает представление. Попробуйте сопоставить это представление с DbSet с FromSql() методом из Ef Core. До этого она запускалась с SQL Server

Хранимая процедура в Postgre SQL:

  CREATE OR REPLACE FUNCTION public.getbyusername_vw_sys_menu_lang()
 RETURNS SETOF "VW_SYS_MENU_LANG"
 LANGUAGE sql
AS $$

    --return query
    SELECT M.* FROM "VW_SYS_MENU_LANG" M
    where M."USERNAME" = 'Admin' -- parameters will be added
    limit 10;

$$;
  

Я получил ошибку в .net Core :

Требуемый столбец ‘ID’ отсутствовал в результатах операции ‘FromSql’.

  var sql = "SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()";
//var sql = "SELECT * FROM VW_SYS_MENU_LANG" //it works with view
 var result1 = dbSet.FromSql(sql) //error : The required column 'ID' was not present in the results of a 'FromSql' operation.
  

MyDbContext : DbContext
….
….

  protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<VW_SYS_MENU_LANG>(e => { e.HasKey(t => new { t.ID, t.LANG }); });
  

В postgres я могу запускать хранимую процедуру без каких-либо ошибок, и она возвращает ожидаемый результат, а столбец ID действительно существует с заглавными буквами. Я преобразовал имена всех таблиц и столбцов в заглавные буквы.

Я думаю, что что-то следует отредактировать в классе DbContext на EF Core или в хранимой процедуре Postgres.

———— ОБНОВЛЕНИЕ ————-

Немного смущенный, я использовал Dbeaver для создания и тестирования таблиц PostgreSQL, функций и т.д.

Когда я запускаю функцию SELECT GETBYUSERNAME_VW_SYS_MENU_LANG() в Dbeaver, она возвращает таблицу со всеми столбцами и данными:

Bbeaver

Когда я запускаю ту же функцию на Pgadmin, результат :

введите описание изображения здесь

Комментарии:

1. PostgreSQL чувствителен к регистру. если вы создадите таблицу со столбцом с именем Id с помощью sql-скрипта, он будет сохранен как «Id», поэтому, если вы обратитесь к нему как к id или ID-коду, он может его не найти. С другой стороны, SQL Server не чувствителен к регистру, у вас не возникнет этой проблемы.

2. Да, я заметил, что postgre чувствителен к регистру. Итак, я создал имена всех таблиц и столбцов с заглавными буквами. Я дважды проверил, и, похоже, все они являются прописными

Ответ №1:

Это должно быть

 SELECT * from GETBYUSERNAME_VW_SYS_MENU_LANG()
  

вместо

 SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()
  

Новичку в разработке PostgreSQL было трудно найти различия.
2-й возвращает один столбец со всеми данными, разделенный запятой. 1-й возвращает все столбцы таблицы (или представления)