#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, она возвращает таблицу со всеми столбцами и данными:
Когда я запускаю ту же функцию на 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-й возвращает все столбцы таблицы (или представления)