Хранимая процедура Postgresql в .net Core () - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь переместить нашу текущую базу данных 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:

В результатах операции FromSql не было обязательного столбца «ID».

 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 , результат будет:

enter image description here

1 Ответ

1 голос
/ 25 апреля 2019

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

SELECT * from GETBYUSERNAME_VW_SYS_MENU_LANG()

вместо

SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()

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

...